C言語なら俺に聞け( ..
[2ch|▼Menu]
290:デフォルトの名無しさん
08/09/23 18:45:30
>>281>>282>>283>>286
みなさんありがとうございます
共用体も初めて聞くので調べてみます

>>284
htonlの後出力する段階でどうしたらいいのかわからなくて

>>287
宿題ではありません
個人的にサーバープログラムを書いています
Cで本格的なプログラムを書くのが初めてなので

>>288>>289
00 00 ff ab 00 cd
みたいな感じで特定のバイト列でサイズのサイズを表し
可変長にしようと考えてます

291:デフォルトの名無しさん
08/09/23 20:25:25
他の既存のプロトコルがどうやってるのか勉強したほうがいい

292:デフォルトの名無しさん
08/09/23 20:45:45
>>291
具体的な例を教えて頂けるとありがたいです
RFCの有名どころくらいしか知らないので

293:デフォルトの名無しさん
08/09/23 21:26:07
>>290
頼むから、そのサーバソフトはLAN内でのみ使ってくれよ。

294:デフォルトの名無しさん
08/09/23 21:26:11
UTF-8形式っていう手もあるよ可変長
負の値が送れないけど

295:デフォルトの名無しさん
08/09/23 21:28:40
バイナリのプロトコルでしょ?

296:デフォルトの名無しさん
08/09/23 21:33:14
可変長で任意のビット数送るのにも使えるということを言ってるのでは

297:デフォルトの名無しさん
08/09/23 21:36:59
>>296
ああ、なるほど。

298:デフォルトの名無しさん
08/09/23 21:40:58
>>290
元データ
00 ab 00 cd
ゼロサプレスしたデータ
00 00 ff ab 00 cd

長くなってるよ

299:デフォルトの名無しさん
08/09/23 21:49:01
まぁ別にその辺はプロトコルの話で、
C言語とは関係無いじゃん

300:デフォルトの名無しさん
08/09/23 22:43:23
見た目の圧縮が目的ではないので長くなって構いません
理論的に大きさに制限の無いデータを全部受け取らなくても
サイズを知ることができるデータ構造が欲しいのです
そのような実例があったら是非教えて頂けると嬉しいです
例えばSMTPなんかは改行などが現れるまでデータの大きさが判りません
拡張でSIZEがありますけどサイズ自体が文字列だから
結局その大きさが判りません
無駄になるかもしれないデータを健気に受け取るより
最小のデータ受信で受け取るか判断できるようにして
トータルで無駄を無くす仕組みにしたいのです

>>294>>296
ありがとうございます
UTF-8調べてみます

>>293
初めてのプログラムですしいきなり誰かに使ってもらうつもりは
毛頭ありませんが他の人に見てもらいたいと思って
真面目に取り組んでいるので
宜しければどの辺が駄目か御教授頂ければ幸いです

301:デフォルトの名無しさん
08/09/23 22:45:07
>>299
すみません
話し逸れてました
他で相談します

302:デフォルトの名無しさん
08/09/24 04:35:53
ヘッダにある構造体を定義して、何個かint型の変数を定義しました
でも一番上に定義した変数だけ思ったとおりになってくれません
最初にその変数を使うときはおもいどおりの数なんですが
二度目以降からなぜか中身が変わってしまいます
変数名を変えてみたりしてもダメでした
なぜか一番上に定義した変数だけなんです
どういう可能性がありますか?

303:デフォルトの名無しさん
08/09/24 04:39:32
>>302
その構造体を晒してみて
あと、環境とかも

304:デフォルトの名無しさん
08/09/24 04:54:50
BCC DeveloperでDXライブラリ使ってます

構造体は
struct STATUS_D{

int w_x;
int w_y;
int pc_x;
int pc_y;
int pc_sx;
int pc_sy;
int menu_x;
int menu_y;
int data_x;
int data_y;
int time_x;
int time_y;
int m_x;
int m_y;
int c_size_x;
int c_size_y;
char menustr[5][STR_MAX];
int menu_num;
int w_handle;
int wb_handle;
int c_handle[5];
int c_handle_num;
};
です
この一番上のint w_x;の値が変わってしまいます

305:デフォルトの名無しさん
08/09/24 05:13:31
>>304
構造体自体には問題ないね。きっとどこかでメモリ破壊をしているんだろう。


306:デフォルトの名無しさん
08/09/24 05:45:18
メモリ破壊してる所見つけるコツみたいなのあります?
全然わかんないです・・・

307:デフォルトの名無しさん
08/09/24 05:48:35
>>306
前後に文字配列を定義してないですか?

308:デフォルトの名無しさん
08/09/24 05:51:55
>>307
それよりこの構造体をどういう風にメモリに確保するか
でも変わるしなあ。

たとえば構造体を配列にしてるとなると構造体内部の配列の
最大値をちゃんと管理してなくてメモリ破壊してるとか。
ただ構造体に情報をセットするのは構造体の先頭の領域から
なら見かけ上正常に動いてるようにも見える。

309:デフォルトの名無しさん
08/09/24 05:55:22
目視デバッグ

310:デフォルトの名無しさん
08/09/24 06:08:33
デバッガーでトレース
構造体のint w_x;の値を表示しておき、ステップ実行で値が変わったところを調べる

311:デフォルトの名無しさん
08/09/24 10:38:33
その構造体すでにfreeしてしまっているとか

312:マジレスチュウ ◆MaJi/01g.w
08/09/24 12:54:50 BE:1465733467-2BP(0)
char型の配列周りが基本的に怪しいよね。
ちゃんとヌルターミネートされてるか、
配列のサイズよりも大きいものを入れる可能性がある場所はないか。
デバッガあるなら>>310の方法で探すのが早いかな

313:デフォルトの名無しさん
08/09/24 19:34:37
#ifdef _DEBUG
#include <stdio.h> //for sprintf
#endif

_DEBUGってなんですか?

314:デフォルトの名無しさん
08/09/24 19:39:57
URLリンク(www.wakhok.ac.jp)

315:デフォルトの名無しさん
08/09/24 20:47:47
>>313
VCではデバッグモードでコンパイルすると
_DEBUGが暗黙のうちにdefineされる。

316:デフォルトの名無しさん
08/09/25 00:48:54
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
}

whileでstrの未処理の値を読み捨てているらしいけど、そこがしっくりこないんだが。
fgetsで読み捨てるって、具体的にどういう処理だ?><

317:デフォルトの名無しさん
08/09/25 00:53:57
>>316
モードが何かは知らんけど、読み捨てるって一定条件に達したら
その後データが存在してても読まないだけじゃないの?

318:デフォルトの名無しさん
08/09/25 00:54:24
サイズをオーバーしたとき

でもその処理そもそもエンターで入力終了と決め込んでるという点がダメな気もする

319:デフォルトの名無しさん
08/09/25 00:55:02
316のはよくない例だな

320:デフォルトの名無しさん
08/09/25 01:01:28
すまん、学校の宿題というかプリントに乗ってるプログラムなんだ><w
実際は
char str[BUFSIZE];
char dummy[4];
int a = 0, b, len;

while(a >= 0) {
printf("a, b = ? ");
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
continue;
}
if(sscanf(str, "%d %d %3s", &a, &b, dummy) != 2) {
printf("input format may be imcomplete\n");
continue;
}
printf("a = %d, b = %d\n", a, b);

}
こんななってる。安全な入力方法の一つだそうで。
オーバー時のwhileの処理は、未処理のまだ残っている値のクリアが目的らしいんだけど、
fgetsでどうクリアするのかがよくわからん><

321:デフォルトの名無しさん
08/09/25 01:04:18
BUFSIZE以上の文字数が入力された場合にBUFSIZE-1で割った最後のあまりのみを有効にする、
かなり頭の悪いやり方。

322:デフォルトの名無しさん
08/09/25 01:11:01
continueがあるから違うだろ。

while(getchar()!='\n')で十分な気はするが。

323:デフォルトの名無しさん
08/09/25 01:17:36
>>322
そうそう、それでもいいって書いてあった。
あれか、未処理だった部分がstrに入ってくるんかね?
んで、未処理だった値も処理されてクリアってこと?><

324:デフォルトの名無しさん
08/09/25 01:21:37
もし想定してるよりも長い文字列が入力されてれば
読み込みきれなかった分までstrに上書きしながら
順次読み込んでいって、以降するはずだった処理は
全部ぶっ飛ばしてまた最初からと言う方法を取ってる

325:デフォルトの名無しさん
08/09/25 01:26:05
ifの直後に同じ判定をwhileでするのは無駄だと思うけどな。
こういうときこそdo{}while使ってやれよw

326:デフォルトの名無しさん
08/09/25 01:28:40
>>324
ありがとうございます、なんとなく解りました。

327:デフォルトの名無しさん
08/09/25 01:32:44
>>325
ちゃんとみろ、それは的外れだ

328:デフォルトの名無しさん
08/09/25 01:35:20
>>327
if内に進んだ最初のwhileの判定はifでしたのとまったく同じだけど?

329:デフォルトの名無しさん
08/09/25 01:42:13
>>328
お前continueが見えてないの?

330:デフォルトの名無しさん
08/09/25 01:43:26
>>329
この話にcontinue関係ないw

331:デフォルトの名無しさん
08/09/25 01:48:29
>if(str[len - 1] != '\n') {
これと
>while(str[len - 1] != '\n') {
これの条件判定が同じで、whileの一回目の判定が無駄だって言ってるんだが理解できてる?

332:デフォルトの名無しさん
08/09/25 01:52:17
まあ、こう言うときはこう直せば良いんじゃね?
とソースを書けば一番手っ取り早いよねと横レス

if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
do {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
} while(str[len - 1] != '\n');
continue;
}

333:デフォルトの名無しさん
08/09/25 02:30:55
自分の関数を周りに使わせたがる同僚にはどう対処したらいいですか?

334:デフォルトの名無しさん
08/09/25 02:33:02
上司になっていいように使う。

335:デフォルトの名無しさん
08/09/25 04:16:05
すまそ。。度忘れしてしまって、googleってもでてこないので、おしえて。

超簡単なことなんだけど、C言語の配列って宣言時にしか初期化できないんだっけか?
しばらくC言語やってないもんで。。

よろしく。

336:デフォルトの名無しさん
08/09/25 07:39:47
別に好きなとこで代入とかして初期化すればいいだろう

それとも初期化子の使用のことか?それなら、宣言時にしか使えないな

337:デフォルトの名無しさん
08/09/25 08:34:04
strcpyとかstrcatとかsprintfとか使いまくってるんですけど
やっぱバグおきますかね?
参考にしてるソースではstrcpy_sとかstrcat_s、sprintf_s使ってるんですが
私BCC使ってるので使えないんです(たぶん)

338:デフォルトの名無しさん
08/09/25 08:36:50
>>337
sprintf()でも%sや%fを生で使わなければ随分違うと思うよ。
例えば、%.20sとするとか%10fにするとかいっそ%gを使うとか。

339:デフォルトの名無しさん
08/09/25 10:27:10
>>337
_sの方を使ってても同じぐらいバグを出しやすいと思うよ。バグっても
セキュリティホールになりにくいだけで。
C++のstringやらCStringを使うほうがいいです。



340:デフォルトの名無しさん
08/09/25 11:48:17
CのスレでC++の話をする奴って何なの?

341:335
08/09/25 13:37:47
>>336
そうです。初期化子のことです><; やっぱ宣言時にしかつかえないんですね><;

宣言時以降で、array[] = {1, 2, 3, 4, 5}; とかいう文をCでそういえばみないなあとおもって。

Javaとかの高級言語ばっかつかってたから、脳みそパープリンになってました。本当にありがとうございました><;

342:デフォルトの名無しさん
08/09/25 13:42:52
Cも一応高級言語なんですけぉ

343:マジレスチュウ ◆MaJi/01g.w
08/09/25 22:29:03 BE:488578627-2BP(100)
>>337
バグ起きるかどうかは自分のコーディング次第じゃない?
strcpy_sはBCCじゃ使えないけど、自分で作ればおk

344:デフォルトの名無しさん
08/09/26 07:51:18
CPU 使用率を下げたいのなら、Sleep(0) ではなく Sleep(10) などと待ち時間が必要

345:デフォルトの名無しさん
08/09/26 08:08:07
おれ=くさかべ先生

346:デフォルトの名無しさん
08/09/26 08:11:17
BUGなのに、偶然としてそれが表にでてこない。
そんなのがバグ。

人は間違えるもの、間違えた時の危機管理が問題であって、
完璧に間違えないように作るという方向では、危機を避けることができない

君がやっているのは問題の先送り。トラブルがでてから対処すればいいじゃん。
それが致命傷になる。


347:デフォルトの名無しさん
08/09/26 12:39:51
保険に入ってれば事故ってから対処すればいいじゃん、てのと同じだな
事故んねえように日頃から心がけることこそ管理しきれない危機への危機管理

どんなにセキュアなシステムでも使う奴がアフォでは結局危ない、という意味で
> 自分のコーディング次第
に賛成

348:デフォルトの名無しさん
08/09/26 13:17:35
サイバーノーガード戦法?

349:デフォルトの名無しさん
08/09/27 13:38:21
大学の授業をサボりぎみで、いつの間にかついていけなくなっていた俺に良い参考書はないですか?
基本まではちゃんとやっていたが、本格的に関数使い出したり二分木のあたりから\(^o^)/

350:デフォルトの名無しさん
08/09/27 13:38:57
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
  } else {
    処理3;
  }
} else {
  処理3;
}
処理4;


処理3を1箇所にする書き方を教えてください。

351:デフォルトの名無しさん
08/09/27 14:01:43
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
  } else {
    goto label;
  }
} else {
label:
  処理3;
}
処理4;

352:デフォルトの名無しさん
08/09/27 14:02:33
if (条件1 && (処理1, 条件2)) {
処理2;
} else {
処理3;
}
処理4;

353:デフォルトの名無しさん
08/09/27 14:04:29
>>351
それはアウトだろボケ

354:デフォルトの名無しさん
08/09/27 14:10:57
switch (条件1) {
default:
処理1;
if (条件2) {
処理2;
break;
}
case 0:
処理3;
}
処理4;

355:デフォルトの名無しさん
08/09/27 14:12:03
>>351
goto使うならこうだな。
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
    goto label;
  }
}
処理3;
label:
処理4;


356:デフォルトの名無しさん
08/09/27 14:18:15
>>355
goto入れる場所違わね?

357:デフォルトの名無しさん
08/09/27 14:24:28
正しいと思う場所に入れてみたら?

358:350
08/09/27 14:38:05
勉強になりました。ありがとうございます。

359:デフォルトの名無しさん
08/09/27 14:44:27
>>349
そのていどwebで十分


360:デフォルトの名無しさん
08/09/27 15:46:20
>>355-357
goto入れる場所変えたらどうにかなるもんでもないでそ。
>>355のgoto文以外の並びじゃどうあがいても無理。

361:デフォルトの名無しさん
08/09/27 17:27:47
皮肉もわからないのかお前は

362:デフォルトの名無しさん
08/09/27 20:19:29
か・・皮肉?

363:デフォルトの名無しさん
08/09/27 21:35:05
kuma-

364:デフォルトの名無しさん
08/09/27 21:44:46
goto を教条主義的に忌避している者は、いざ使おうとすると付け焼き刃で桁下がりが出まくり

365:デフォルトの名無しさん
08/09/27 22:12:52
switch( !条件1 ){
 case 0:
  処理1;
  if( 条件2 ){
   処理2;
   break;
  }
 case 1:
  処理3;
}

366:デフォルトの名無しさん
08/09/27 22:17:12
しつこい

367:デフォルトの名無しさん
08/09/27 22:57:13
Cに限らないかもしれないけど
0 < hoge
みたいに比較演算子使うときに定数を左辺に持ってくる書き方は
どのようなメリットがあるのですか?

368:デフォルトの名無しさん
08/09/27 22:59:09
見た目が分かりやすくなるという人も居る

369:デフォルトの名無しさん
08/09/27 22:59:50
>>367
イメージとして数直線があるとき

370:デフォルトの名無しさん
08/09/27 23:01:03
0 < hoge && hoge < 10
なんかだと数学の書き方にちょっと似る

371:デフォルトの名無しさん
08/09/27 23:08:13
もう何年も>演算子を使っていない

372:デフォルトの名無しさん
08/09/27 23:09:49
>>370
0 ≦ hoge ≦ 10 みたいな書き方からの連想だよね。

373:デフォルトの名無しさん
08/09/27 23:10:10
>>371
よう俺

374:デフォルトの名無しさん
08/09/27 23:12:44
>>368
自分は代入演算子と間違えないためかと思ってました

>>369
なるほど〜
数直線なんて単語すっかり忘れてました

>>370
そういう使い方もあるのですね

とても参考になりました
ありがとうございます

375:デフォルトの名無しさん
08/09/28 02:25:39
int配列で hoge[] = {1,2,3,4} みたいな物を
1234と連結させたint型に直したい時に
なにか賢い方法ありますか?

376:デフォルトの名無しさん
08/09/28 02:27:34
>>375
1234と連結させたint型とはなんですか?
10進数の1234ですか。

377:デフォルトの名無しさん
08/09/28 02:28:14
ごめんなさい、そうです

378:デフォルトの名無しさん
08/09/28 02:34:06
for(i=0,n=0;i<hogelen;i++) n=10*n+hoge[i];

379:デフォルトの名無しさん
08/09/28 08:17:06
標準ライブラリの関数ってどのぐらい早いの?

380:デフォルトの名無しさん
08/09/28 08:47:23
Windowsで、system("test.exe")と実行ファイルを呼び出したとき、
test.exeはどのパスにあるか調べる方法はありますか?

381:デフォルトの名無しさん
08/09/28 08:50:53
もしくは、test.exeが利用可能か調べる方法でも良いです。

382:デフォルトの名無しさん
08/09/28 08:58:32
>>380
つmain

383:デフォルトの名無しさん
08/09/28 09:01:41
>>379
例えばmemcpyはバイト数指定なのに32bit単位でコピーして端数処理もやってるのもあるから、そこそこ速い

384:デフォルトの名無しさん
08/09/28 09:02:59
>>382
もうちょい教えてください。やり方判りません

385:デフォルトの名無しさん
08/09/28 09:40:52
>>382じゃないけどargc、argvを貰えと言ってるんだと思う

386:デフォルトの名無しさん
08/09/28 09:43:21
二次元配列を別の関数へ渡す時
なぜこの方法で渡せるのかわかりません。
[2][2]で受け渡したいです。

void func(int array[][2]); //関数宣言

void mainf(){

int array[2][2]={1,2,
3,4};

func(array)

}

void func(int array[][2]){
}

387:デフォルトの名無しさん
08/09/28 10:01:23
[2][2]でも渡せる。
なぜ[][2]で渡せるかは配列の構造を調べてみるべし

388:デフォルトの名無しさん
08/09/28 10:05:12
>>387
配列は
最初のアドレスとデータ型さえわかれば

次の番地がわかるってことですか?
そんでNULLまでが範囲ってことですか?

2次元だと添字情報がないと
次の番地がわからないので
書かなきゃいけないってことですね?

日本語でちゃんと説明できませんが
なんとなくわかりました。

389:デフォルトの名無しさん
08/09/28 10:11:02
>>388
ただし、範囲のチェックはやってない。

390:マジレスチュウ ◆MaJi/01g.w
08/09/28 11:49:54 BE:418780962-2BP(100)
>>380
環境変数のPATHのディレクトリを順に参照していってtest.exeを探していくんじゃダメ?
なかったら最後にカレントディレクトリ調べて、それでもなければ利用不可能って事になる。

391:デフォルトの名無しさん
08/09/28 11:57:31
>>390
カレントディレクトリは一番最初でしょう。

392:マジレスチュウ ◆MaJi/01g.w
08/09/28 12:34:20 BE:1710022177-2BP(100)
内部コマンド → カレントディレクトリ → PATHに記述されたディレクトリ
の順番か。ごめんなさい><

393:デフォルトの名無しさん
08/09/28 12:42:25
違うだろ

394:デフォルトの名無しさん
08/09/28 13:19:25
環境による

395:デフォルトの名無しさん
08/09/28 13:21:16
windowsの話してるんだろ

396:デフォルトの名無しさん
08/09/28 13:44:40
というかC関係ないね

397:デフォルトの名無しさん
08/09/28 15:12:09
だよな

398:くさかべ様
08/09/28 16:44:19
まあ俺に聞けばなんでもわかる、mixiでもIRCでも俺が相手になってやる。



399:デフォルトの名無しさん
08/09/28 16:48:57
豆でも食ってろ

400:デフォルトの名無しさん
08/09/28 18:18:09
すみません。友達にEclipseっていうののコンパイラだと何も設定しなくても
使えるときいたのですが、本当ですか?

以前、ボーランドという会社のコンパイラを使おうと思ったのですが
うまくいかなかったので。。

もし、なにも設定しなくてもいいなら、つかってみたいんですが。
よろしくお願いします。

401:デフォルトの名無しさん
08/09/28 18:21:46
Eclipseはコンパイラじゃないよ

402:デフォルトの名無しさん
08/09/28 18:23:06
>>400
なにも設定したくないならvisualstudioおすすめ

403:デフォルトの名無しさん
08/09/28 18:26:45
PCの基礎知識が無いのにプログラミングは早すぎる

404:デフォルトの名無しさん
08/09/28 18:38:19
パスも通せないでプログラムですか

405:400
08/09/28 18:40:10
みなさん、ありがとうございます。やはり、私には無理みたいですね。
一度プログラムというのをやってみたいと思っていたのです。
visualstudioでググってみましたら、ただらしいですね。そいつでやってみます。
このいたの上にも情報があるみたいですね。ありがとうございました。

406:デフォルトの名無しさん
08/09/28 19:24:39
>>405
がんがれノシ

407:デフォルトの名無しさん
08/09/28 19:31:03
>>405
まあ、これで覚えろ

きっかけが無いと覚えれないしな。

408:デフォルトの名無しさん
08/09/28 22:19:16
main関数の2番目の引数の char *argv[]
って、argv[]っていう配列へのぽちんたという意味なのか、
ぽちんた変数配列argvっていう意味なのかどっちなの?

教えてエロイ人。

409:408
08/09/28 22:20:06
まちがえた。

ぽちんた変数配列argvっていう意味
     ↓
ぽちんた変数の配列argvっていう意味

410:デフォルトの名無しさん
08/09/28 22:25:00
char *argv[]っていう書式的にはぽちんた変数の配列argv
っていう意味で合ってる

でも実際はchar **argvだけど

411:デフォルトの名無しさん
08/09/28 22:26:37
ぽちんた変数と呼ぶのが今の流行りなのか?

412:デフォルトの名無しさん
08/09/28 22:34:33
幼稚な奴にあわせる必要は無い

413:408
08/09/28 22:56:14
みんなどうもありがとう。ぽちんた変数の配列argvっていう意味なんだね。

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

414:デフォルトの名無しさん
08/09/28 23:05:44
ぽちんた言いたいだけやろ


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

416:デフォルトの名無しさん
08/09/28 23:28:23
>>415
最後の改行文字をヌル文字に書き換える

417:416
08/09/28 23:39:06
なるほど、感涙。ありがとうございました。>>416

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

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

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

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

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

420:デフォルトの名無しさん
08/09/29 01:39:30
結論だけ言うと、配列で宣言しなくちゃいけない

421:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/29 04:42:34
>>421 構造体メンバのアライメント(バウンダリ)の問題だと思う。

423:デフォルトの名無しさん
08/09/29 04:45:07
そのコンパイラでは以下のようなアラインメントになっている

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

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

とすればおk


425:デフォルトの名無しさん
08/09/29 05:35:56
1バイト読んでから再度freadで12バイト読まないとダメ

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

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

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

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

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

431:デフォルトの名無しさん
08/09/29 14:21:47
>>430
うそつくな

432:デフォルトの名無しさん
08/09/29 14:50:48 BE:556925928-2BP(40)
>>430
>>429

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

そんなことねーだろ。

434:430
08/09/29 22:28:12
カンで書いてみたけどやっぱダメかw
ごめんねごめんね^^

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

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

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

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

439:デフォルトの名無しさん
08/09/30 00:58:06
片方の名前を変えればおk

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

441:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/30 08:42:43
グローバル変数ってあんま使わないほうがいいの?
ゲーム作ろうとするとグローバルのほうが簡単に書けるような気がするんだけど

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

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

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

444:デフォルトの名無しさん
08/09/30 10:25:57
Insufficient memory(out of memory)
in function cvalloc

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

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

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

447:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/30 18:04:05
そもそもTCHAR型がなんなのか理解しているか

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

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

451:447
08/09/30 18:11:59
>>449
OSはWindowsXP、コンパイラはVisualC++2008です。

452:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/30 18:13:35
>>450
文字コードの種類を一度勉強したほうがいいよ。
どうせS-JIS、JIS,

454:453
08/09/30 18:14:21
途中になった
EUC,UTF系との相互変換とかくらいだろうし

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

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

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

458:デフォルトの名無しさん
08/09/30 20:19:38
ヒント:可変長引数

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

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

461:デフォルトの名無しさん
08/09/30 20:25:22
>>459
ヒント:printf()

462:デフォルトの名無しさん
08/09/30 20:35:11
入出力以外になんか使い道あるの?

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

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

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

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

466:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/30 21:40:33
32bit レジスタ上で

00 00 60 EA

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

リトルエンディアンだと

EA 60 00 00


468:きもい
08/09/30 21:45:36
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ
くさかべくさかべくさかべくさかべくさかべくさかべくさかべくさかべ


469:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/09/30 22:03:17
>>467
>>469

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

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



471:デフォルトの名無しさん
08/09/30 22:04:04
>>466 ソケット通信ならhtol関数、htolh関数を使えばいい。

472:デフォルトの名無しさん
08/09/30 22:07:13
>>471
すいません。プログラミングの素養は0なんです。

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

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

475:デフォルトの名無しさん
08/09/30 22:15:09
bit?

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

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

478:デフォルトの名無しさん
08/09/30 22:20:20

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

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

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

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

481:デフォルトの名無しさん
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
プログラムが正しいかどうか、他人に聞くしかテスト技法を知らんのか
テスト項目の導き方はいろいろある
それが知りたければ便所の落書きより有料情報をあたったほうがいい


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4210日前に更新/128 KB
担当:undef