[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 07/29 12:15 / Filesize : 128 KB / Number-of Response : 591
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 36



1 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:40:35 ]
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 115代目
  pc11.2ch.net/test/read.cgi/tech/1217741118/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
  C言語なら俺に聞け(入門篇) Part 35
  pc11.2ch.net/test/read.cgi/tech/1219761846/
過去スレ
  makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

413 名前:408 mailto:sage [2008/09/28(日) 22:56:14 ]
みんなどうもありがとう。ぽちんた変数の配列argvっていう意味なんだね。

細かいところがむずかしいね。ありがとう。よくわかったよ。

414 名前:デフォルトの名無しさん [2008/09/28(日) 23:05:44 ]
ぽちんた言いたいだけやろ


415 名前:デフォルトの名無しさん [2008/09/28(日) 23:26:54 ]
fgetsでstdinから文字を取得します。改行文字まで取得してしまうそうですが、
改行文字をなくしたいです。どうすればいいですか?

416 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 23:28:23 ]
>>415
最後の改行文字をヌル文字に書き換える

417 名前:416 [2008/09/28(日) 23:39:06 ]
なるほど、感涙。ありがとうございました。>>416

418 名前:デフォルトの名無しさん [2008/09/29(月) 01:29:14 ]
ある本を本でいたら(1990年くらいの本)、文字列はこう表現しますなんて記述で
*str = "abcde";
ってかいてあったんだ。でも今の本はたいてい char str[80] = "abcde"ってかいてある。

最初の本のことが頭にあったから、char *str1=""; *str2="";と宣言してそれにgetsで読み込ませたら
str1のあとに必ずstr2の文字まで連結されて格納されてしまうんだけど、それはやっぱそういうことで
stdinから読み込ませる文字列を格納するのは、ポインタでなく配列で宣言しなくちゃいけないわけなの?

なんか、こないだ立ち読みしてた本でも文字列はポインタで表現みたいな事が強調してあったから
読み込ませる文字列もポインタに読み込ませればいいのかなとおもったんだけど。

すまそ。寝るのでお礼は明日になります。教えてくれる方、よろしくお願いします。

419 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 01:38:11 ]
結論から言うと全然違う
おまえが無茶苦茶してるだけ
眠い上に長くなるから今説明しないけど

420 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 01:39:30 ]
結論だけ言うと、配列で宣言しなくちゃいけない

421 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:15:22 ]
ファイルから13バイトのデータを読むために
struct database {
char boolen;
long data[3];
};
このような構造体を作ってfreadで読み込んだのですが
charのところで4バイト読み込み、最初の1バイトだけ変数に入れて3バイト破棄するという変な動作をします。
printf("%d\n",sizeof(struct database));
で表示させたところ16と表示されどうにもこうにもできません。
どうすればちゃんと1バイトだけ読み込むのか教えてください。お願いします。



422 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:42:34 ]
>>421 構造体メンバのアライメント(バウンダリ)の問題だと思う。

423 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:45:07 ]
そのコンパイラでは以下のようなアラインメントになっている

*--- char boolean
**** float data[1]
**** float data[1]
**** float data[2]

424 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 04:47:51 ]
1バイト読む->boolenに格納
4バイト読む->data[0]に格納
4バイト読む->data[1]に格納
4バイト読む->data[2]に格納

とすればおk


425 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 05:35:56 ]
1バイト読んでから再度freadで12バイト読まないとダメ

426 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 06:15:10 ]
#pragma pack()とかパディングを無くす抜け道はある
しかし>>424,425さんのように手間を惜しまない方が賢明

427 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 08:37:49 ]
>>418
とりあえず、本は買って隅から隅まで読め

428 名前:421 mailto:sage [2008/09/29(月) 09:50:01 ]
>>422-426
ありがとうございます。
コンパイラの仕様でそうなっているんですか。
やっぱり一気に読むより個別に読んだほうが確実ですね。

429 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 09:59:04 ]
まあ個別に読むのもいいけど、アライメントについて調べておいたほうがいいよ。
書くときにも同じことやりそうだし。

430 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:05:10 ]
>>421
union chinpo
{
char str1[13];
struct database {
char boolen;
long data[3];
};
ユニオン使って、srt1で一括読み込みすればいいですよ。

431 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:21:47 ]
>>430
うそつくな



432 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:50:48 BE:556925928-2BP(40)]
>>430
>>429

433 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 20:02:24 ]
>>418
> でも今の本はたいてい char str[80] = "abcde"ってかいてある。

そんなことねーだろ。

434 名前:430 mailto:sage [2008/09/29(月) 22:28:12 ]
カンで書いてみたけどやっぱダメかw
ごめんねごめんね^^

435 名前:デフォルトの名無しさん [2008/09/29(月) 22:31:16 ]
>>434
せめてやりとりぐらいは呼んでからレスしてね

436 名前:デフォルトの名無しさん [2008/09/29(月) 22:53:58 ]
カタカナ表記のユニオンがいいな
ユニックス的でいかすぜ

437 名前:418 mailto:sage [2008/09/30(火) 00:56:23 ]
>>419-420 どうもありがとうございます。これからは、標準入力から入力する文字列は
必ず、配列で宣言するようにします><;ありがとうございました。

438 名前:デフォルトの名無しさん [2008/09/30(火) 00:57:38 ]
すみません。グローバル変数とローカル変数を同じ名前にしてしまい、
printfで出力しようとおもったら、困りました。出力できませんかね?

439 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 00:58:06 ]
片方の名前を変えればおk

440 名前:438 mailto:sage [2008/09/30(火) 01:29:39 ]
>>439
やはり無理みたいですね。ローカル変数の名前を変えます。ありがとうございました。

441 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 01:36:52 ]
>>438
影響範囲が大きすぎて触るのが怖い場合は、グローバル変数にアクセスするための関数を作ればおk
#include<stdio.h>
int value=1234;
char string[256]="this is global.";
int *global_value(void){
return &value;
}
char *global_string(void){
return string;
}
int main(void)
{
int value=2345;
char string[256]="this is local.";

printf("value=%d\n", value);
printf("string=%s\n", string);
printf("value=%d\n", *global_value());
printf("string=%s\n", global_string());

return 0;
}



442 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:42:43 ]
グローバル変数ってあんま使わないほうがいいの?
ゲーム作ろうとするとグローバルのほうが簡単に書けるような気がするんだけど

443 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 08:46:38 ]
>>442
そのグローバル領域の使い方次第じゃないの?

アクセス速度ばっかり追求しすぎて別ソースに書かれてる
領域へexternでアクセスしてればわかりにくいソースになるし。
速度は犠牲になるけど、別ソースで持ってる領域へアクセスする場合は
アクセス用関数を用意して領域をいじるとかね。

あとは命名規則をしっかり作って、どこ管理の関数・領域かが
一目でわかるようにしてあればexternで触っても問題ないだろうし。

444 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 10:25:57 ]
Insufficient memory(out of memory)
in function cvalloc

というエラーが出てプログラムがとまってしまいます。
これを防ぐにはどうしたらいいでしょうか。

445 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 10:31:17 ]
>>444
メモリが足らない、と言ってる
・メモリを増やす
・メモリの使い方を見直して無駄遣いを減らすなり節約するなり

446 名前:デフォルトの名無しさん [2008/09/30(火) 17:25:04 ]
>>442
そう思うなら、とことんやってみれ
なんでダメなのかもわからん奴が教条主義的に嫌って書いたコードは
おぬしのコードよりダメだぜ、きっと

447 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 17:50:35 ]
void ChangeWtoM(char *malt, char *wide, int len_wide)
{
int i, j;

for(i = 0, j = 0; i < len_wide*2; i++){
if(wide[i] != '\0')
malt[j++] = wide[i];
}

malt[j] = '\0';
}

int main()
{

TCHAR wide[64] = L"testテストですtest";
char malt[64];

ChangeWtoM(malt, (char*)wide, lstrlen(wide));
printf("%s", malt);

return 0;
}

ワイド文字文字列をマルチバイト文字列に変換する関数を作りたいのです。
いろいろ試してみたのですが上手く行きません。
これは何がいけないのでしょうか。

448 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:04:05 ]
そもそもTCHAR型がなんなのか理解しているか

449 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:08:39 ]
突っ込みどころが多すぎる。
環境は?汎用的に作ると長くなるから特定したほうがいいかも。

450 名前:447 mailto:sage [2008/09/30(火) 18:10:13 ]
1文字に2バイト使うcharで1バイトしか要らない場合は'\0'が入ってる
だと思っているんですけど

451 名前:447 mailto:sage [2008/09/30(火) 18:11:59 ]
>>449
OSはWindowsXP、コンパイラはVisualC++2008です。



452 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:12:55 ]
>>450
実際のワイド文字列とマルチバイト文字列を見比べてみ
void p(char *p, int len) {
int i;
for (i = 0; i < len; i++)
printf("%02x ", p[i] & 255);
printf("\n");
}
int main() {
wchar_t *wide = L"testテストですtest";
char *mb = "testテストですtest";
p((char*) wide, wcslen(wide) * 2);
p(mb, strlen(mb));
}

453 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:13:35 ]
>>450
文字コードの種類を一度勉強したほうがいいよ。
どうせS-JIS、JIS,

454 名前:453 mailto:sage [2008/09/30(火) 18:14:21 ]
途中になった
EUC,UTF系との相互変換とかくらいだろうし

455 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:17:02 ]
Windowsなら、WideCharToMultiByte()APIがあるから、それ使うか、
VC++なら、CStringを使って、、、っとこれはC++だからスレ違いか。

456 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 18:21:52 ]
>>452-455
ありがとうございます
アドバイスを元にいろいろ調べてみます

457 名前:デフォルトの名無しさん [2008/09/30(火) 20:00:21 ]
関数ポインタの配列を使って、色々と作成してるんだけど、
たとえば int (*p[5])(int x, int y)っていう関数へのポインタ変数の配列pをつくったとする
この配列に格納できる関数は戻り値がint型で、引数はint型を2つとる関数じゃないと
だめみたいなんだけど、Cでは色んな型の戻り値や引数を持つ関数をたくさん収納できる
配列っていうのは、作成できないんですか?よくわからないけど、void型で宣言しておいてあとでキャストするとかしても
無理なんでしょうか?よろしくお願いしますm(_ _)m

458 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:19:38 ]
ヒント:可変長引数

459 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:21:15 ]
可変長引数って配列にしてポインタ渡せばいいじゃんって思うんだけどなんでそんな機能があるの?

460 名前:デフォルトの名無しさん [2008/09/30(火) 20:21:44 ]
>>457
0 <= n && n < 5 として
int r = (*p[n])(ここを); どう書きたいんでい?

461 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:25:22 ]
>>459
ヒント:printf()



462 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:35:11 ]
入出力以外になんか使い道あるの?

463 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:39:23 ]
関数ポインタで分岐させる関数それぞれが引数の形や戻りが違うようにしたいのであれば
構造体を連絡用にしてその構造体のポインタ1個だけを引数にする関数にしてしまえばいい。

あとは構造体全体を共用体にでもして引数が変わる関数分用意すればいい。

464 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 20:40:47 ]
printfは第二引数が可変長になってるから
printf("a=%d b=%d",a,b);
って使い方ができるだろ

465 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:02:50 ]
>457
ちなみに戻り値も引数もバラバラな関数群へのポインタを
配列に格納したいというのは、どういったシチュエーション?
>460 が指摘しているように call するときの手間を考えたら
メリットなさげ

466 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:34:52 ]
すいません。どこで聞いたらよいか分かりませんので、ここで質問させて頂きます。

*エンディアン、MSB/LSBファースト、インテル、モトローラ, 送信値の関係
  Big Endian = Motorola = メモリ番地0にMSB = MSBファースト
  Little Endian = Intel = メモリ番地0にLSB=LSBファースト
  とまでは分かっています。

仮に、10進数60000を0- 1byte(2byte)使い、送信するとします。
  60000(10進)=>EA60(16進)

  MSB = 0 byte LSB=7byteで定義し、ビッグエンディアンで送信するとき、
 バイトの並びはどちらが正しいでしょうか?

 @ EA 60 00 00 00 00 00 00
 A 60 EA 00 00 00 00 00 00
byte 0 1 2 3 4 5 6 7
  MSB LSB

あほですいません。ご教授お願い致します。

467 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:40:33 ]
32bit レジスタ上で

00 00 60 EA

ビッグエンディアンだと
00 00 60 EA

リトルエンディアンだと

EA 60 00 00


468 名前:きもい [2008/09/30(火) 21:45:36 ]
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ


469 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 21:46:16 ]
>>466
意味が分からんよ
long x=0x12345678;
short y[2]={0x1234,0x5678};

ビッグエンディアン
x : 12 34 56 78
y : 12 34 56 78

リトルエンディアン
x : 78 56 34 12
y : 34 12 78 56

こうなる

MSB = 0 byte LSB=7byteで定義したら
>>466 の数値をビッグエンディアンで表現すると
00 00 00 00 00 00 EA 60
じゃないかな?

> 0- 1byte(2byte)使い、
これでは定義と両立できない気がする

470 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:03:17 ]
>>467
>>469

ご回答ありがとうございます。
Endianの問題はハードウェアに依存し、
MSB/LSBのバイト定義はソフトの問題だと認識してよろしいでしょうか?

MSB=0byteのLittle Endian方式とMSB=7byteのBig Endianは結果的に
同じと理解してもよろしいでしょうか?



471 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:04:04 ]
>>466 ソケット通信ならhtol関数、htolh関数を使えばいい。



472 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:07:13 ]
>>471
すいません。プログラミングの素養は0なんです。

473 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:10:27 ]
>>470
>MSB/LSBのバイト定義はソフトの問題だと認識してよろしいでしょうか?
バイトオーダと型の大きさによる

474 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:13:12 ]
>>470
言ってることが理解できん。
MSB=0byteってどういう意味なんだ。

475 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:15:09 ]
bit?

476 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:16:10 ]
>>474
0バイト目って意味じゃないかな
勿論マのいう 0 番目は一般人の 1 番目相当だがw

477 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:18:54 ]
>>474
通常なら、32bit系の場合、
LSB=0 byte目、MSB=4byte目
なんでしょうけど、
これの定義が逆になっている製品があるんです。
スレ違いかもしれませんが、車載LAN (CAN)の話です。
基本的には、シリアル通信なので、この問題は同じかなと思ったのですが・・・

478 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:20:20 ]

訂正です。0ベースで書いてるので、MSB=3byte目ですね。

479 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 22:45:29 ]
速度的に問題が無ければテキストで送るという手もある。

480 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:06:24 ]
>>477
ビッグエンディアンなら常に
MSB=0byte目
LSB=(型のサイズ)-1byte目

リトルエンディアンなら常に
LSB=0byte目
MSB=(型のサイズ)-1byte目

481 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:43:09 ]
>>480 ご回答ありがとうございます。

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

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







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

483 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:48:57 ]
>>482
わかりました。

484 名前:457 mailto:sage [2008/09/30(火) 23:49:06 ]
どうも皆さん、色々書いていただきまして、ありがとうございます。

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

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

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

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

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

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

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

487 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:20:04 ]
>>482
まだいます。すいません。

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

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

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


488 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:38:20 ]
>>487
ここをみて勉強してください
www.ertl.jp/~takayuki/readings/info/no05.html

489 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:44:37 ]
>>488
ありがとうございます。

490 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:51:38 ]
Intelだけなんだよな。リトルエディアンは。

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

491 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 00:53:07 ]
>>490
おいおいw



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

493 名前:490 mailto:sage [2008/10/01(水) 00:58:27 ]
>>492 そうか、知らんかった


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

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

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

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

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

497 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 02:04:26 ]
わかれ

498 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 02:12:39 ]
なに?ヒープじゃ足りないの?組み込み?

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

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

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

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



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

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

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

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

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

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

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

504 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 04:30:29 ]
これか↓
www.linux.or.jp/JM/html/LDP_man-pages/man3/alloca.3.html

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

505 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 04:42:25 ]
>>503
too many positional parameters

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

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

506 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 13:27:19 ]
>503
スレ違いだと思う

507 名前:503 mailto:sage [2008/10/01(水) 13:35:16 ]
>>505
ありがとうございます

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

508 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん [2008/10/01(水) 19:23:00 ]
以前作ろうとして大失敗したから不安。

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

510 名前:デフォルトの名無しさん mailto:sage [2008/10/01(水) 19:30:51 ]
おkにみえる

511 名前:デフォルトの名無しさん [2008/10/01(水) 19:35:55 ]
なぜ bsearch を使わん?



512 名前:デフォルトの名無しさん [2008/10/01(水) 19:38:50 ]
>>511

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

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






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<128KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef