トップページ⇒tech
1001コメント250KB

C言語なら俺に聞け! Part 99

■ このスレッドは過去ログ倉庫に格納されています
0001v(^o^i)dNGNG
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 98
http://pc5.2ch.net/test/read.cgi/tech/1104114259/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0446デフォルトの名無しさん05/01/17 21:28:20
>>444
その調子で、誰も理解してくれないからって、引き篭ってきたんとちゃうの?
0447デフォルトの名無しさん05/01/17 21:32:14
>>445
別に俺が言う必要ねえんだよ
ISO が言ってくれてるから
0448デフォルトの名無しさん05/01/17 21:32:38
こらー、仲良くしなさーい!
0449デフォルトの名無しさん05/01/17 21:34:47
8:知能障害を起こす
って起せるものなのか?
0450デフォルトの名無しさん05/01/17 21:36:47
>>449
わりと簡単。
0451デフォルトの名無しさん05/01/17 21:37:53
>449
君の頭、外科手術したげるね
0452デフォルトの名無しさん05/01/17 21:40:03
なーるほど
0453デフォルトの名無しさん05/01/17 21:42:41
>>442
BSDライセンスでよければ、FreeBSDとかにでも入ってるでしょ
0454デフォルトの名無しさん05/01/17 23:09:21
ほっ、ほぁーっ! ほぁーっ!! ぬるぽ
0455デフォルトの名無しさん05/01/17 23:19:51
finally {
    >>454ガッ
}
0456デフォルトの名無しさん05/01/17 23:23:21
>>455
syntax error
ここはCスレですよ
0457デフォルトの名無しさん05/01/17 23:31:40
>>455
error: unexpected character { near finally
0458デフォルトの名無しさん05/01/18 00:39:05
あるサンプルプログラム(.cpp)をテキストで開いたら
一行がすごく長くてところどころに↑矢印みたいなやつが入ってるんですけど、
この矢印ごとに簡単に改行する方法はありますか?

それとも今はテキストでしか見てないのですが、
他のエディタであれば正常通り見られますかね?
0459デフォルトの名無しさん05/01/18 00:40:47
>.cpp
スレ違い
0460デフォルトの名無しさん05/01/18 00:44:18
>>458
具体的に開いたエディタを上げてみそ。

ちなみに俺の勘によれば、たぶん改行コードがLFだけになっているのでしょう。
であるので、見るだけならWebブラウザでも見れますし、
ちょっと気の利いたエディタならたいがいちゃんと編集もできるでしょう。
0461デフォルトの名無しさん05/01/18 03:18:03
IEブラウザなら見れるんじゃね?
046245805/01/18 09:26:30
IEブラウザで正常にみることができました。

スレ違い申し訳ないです。ありがとうございました。
0463デフォルトの名無しさん05/01/18 10:47:19
ダブルポインタで確保した多重配列の現在のサイズを
取得したいのですがいい方法はありませんでしょうか?

ソースは以下のようになっています。

  // 200バイトを10列分確保 (buffer[10][200])
  char** buffer;

  buffer = (char**)malloc(sizeof(char*)*10);
  for(int i=0;i<10;i++)
  {
    buffer[i] = (char*)malloc(200 * sizeof(char));
    memset(buffer[i], 0, 200);
  }

  // freeや必要な処理はこのあとで
0464デフォルトの名無しさん05/01/18 10:54:02
>>463
ありません
0465デフォルトの名無しさん05/01/18 11:01:35
printf("\x1b[2A");
と書いてもカーソルが移動しないで"2A"と表示されてしまう
んですけどなんか間違ってます?
0466デフォルトの名無しさん05/01/18 11:02:22
>463
小学生に掛け算教えてもらえ。
callocや#define talloc(n,type)
使えば簡単なのに
0467デフォルトの名無しさん05/01/18 11:06:37
>>465
質問するスレから間違ってます。
OSやコンパイラくらい書いてくれ。
0468デフォルトの名無しさん05/01/18 11:14:57
>465
NT系か9x系か知らないが、コンソール端末で
C:\> adddrv ansi.sys
を実行した後、その端末でプログラムを実行してみろ。
046946505/01/18 11:17:07
>>467
OS:WINDOWS 2000
コンパイラ:visual C++ 6.0
です。
これってC言語だけのエスケープシーケンスじゃないんですか?
0470デフォルトの名無しさん05/01/18 11:19:52
>>469
C言語とは関係ありません。
2000でソレをやりたかったら
CONFIG.NTにANSI.SYSを追加して16bitコードを吐くコンパイラを
使用しないとダメ。VC6.0ではprintfではできません。
047146505/01/18 11:21:05
>>468
コマンドプロンプトでC:\>adddrv ansi.sysを実行するという意味でしょうか?
試してみましたが、その後プログラムを実行してもやはり同じでした・・。
0472デフォルトの名無しさん05/01/18 11:23:41
NT系だと、dosx使う方法もあるが(ry
047346505/01/18 11:26:34
>>470
え・・そうなんですか。
なんで課題で出たんだろう・・・、学校もVC6.0なのに。
では現在の環境で、カーソルを移動させる手段が他にあるのでしょうか?
現在時刻を同じ場所で上書きして表示させるプログラムを書きたいのですが・・
0474デフォルトの名無しさん05/01/18 11:28:49
>473
'\r'出力か、<conio.h>使えば〜?
047546505/01/18 11:43:41
>>474
"表示するフォーマット\r"でできました、ありがとうございました。
0476デフォルトの名無しさん05/01/18 11:48:54
>470
dosx使えば32bitの混合コードも受け付けるんじゃなかった?
0477どうしても判らないんです。助けてください・・・05/01/18 11:51:31
突然教えてちゃんでごめんなさい
なりふり構ってられなくて、、><;

問題
与えられたグラフGに対しKruskalの算法をもちい最小木を求めるプログラムを作る。
条件1・採用した辺からできる部分グラフの連結成分を保持するデータ構造において、
linkを行う際にunion by rank だけ取り入れたものとunion by rank と path compression を
併用したものの両方を作成。
条件2・四則演算、比較、代入の総数を計測し、最小木とともにその総数を出力すること
0478デフォルトの名無しさん05/01/18 11:53:08
>>477
>>1を読んで下さい
0479デフォルトの名無しさん05/01/18 12:02:40
>477
落ち着いてテキスト読め。グラフ理論の用語が分からないなら数学板に行け。グラフを表すデータ構造が分からないなら聞くがよい。
0480デフォルトの名無しさん05/01/18 12:12:04
いや、ここで聞くな。宿題スレ逝け。
0481デフォルトの名無しさん05/01/18 12:17:08
>>463
「ダブルポインタ」とかいう一般的でない言葉を使うのはやめれ。

で、「200」とか「10」とかいう数字をキミのプログラムは知っている
ではないか。それをどこかに保存すればいいんですよ。
0482デフォルトの名無しさん05/01/18 12:40:55
>>463
ついでに言うと、それは正確には多重配列とは言わない。
0483デフォルトの名無しさん05/01/18 13:55:03
( ´∀`)ダブルぬるぽ
0484デフォルトの名無しさん05/01/18 14:08:27
>>483
いやまて、最初のぬるぽは
次のぬるぽを指してはいないぞ。
0485デフォルトの名無しさん05/01/18 14:15:21
いずれにせよ
          | |
          | | ガガッ
  ( ・∀・)   .人
 と    )  <  >_∧∩
   Y /ノ    .人`Д´)/ ←>>483
    / )    <  >_∧∩
  _/し' //. V`Д´)/ ←>>484
 (_フ彡       /
048646305/01/18 15:37:41
>>466
配列全体のサイズではなく要素数を取得したかったです。
質問が間違っていました。

>>481
一般的いでない言葉は使わないようにしておきます。
200、10(要素数)を静的に保存するのはヘボくないですか?
スマートに任意のタイミングで計測できないかが知りたいです。

>>482
はい分かっています。
0487デフォルトの名無しさん05/01/18 16:04:50
>一般的いでない言葉は使わないようにしておきます。
×ダブルポインタ
○ポポインタ
0488デフォルトの名無しさん05/01/18 16:09:03
>>486
どういうわけか、malloc() した領域のサイズを取る手段って標準では
ないんですよね。ライブラリ内でサイズを保持してない訳ないのに。
なので、ヘボくても仕方ないので自分で記録するしかないです。

typedef struct {
int num;
char elem[];
} foo_t;

typedef struct {
int num;
foo_t *foo[];
} buffer_t;

buffer_t *buffer;
buffer = malloc(sizeof(buffer_t) + sizeof(foo_t *) * N1);
buffer->num = N1;
for (int i = 0; i < N1; i++) {
buffer->foo[i] = malloc(sizeof(foo_t) + sizeof(char) * N2);
buffer->foo[i]->num = N2;
memset(&buffer->foo[i]->elem, 0, sizeof(char) * N2);
}

みたいなー。
0489デフォルトの名無しさん05/01/18 17:02:20
>488
吐きそう。ゲー。その上、こんな低次元の処理で構造体使うか? calloc,_msize…、やめた、どうせ人の忠告聞かないんだから。
0490デフォルトの名無しさん05/01/18 17:08:59
>>489
VCしか知らない奴は黙ってろ
0491デフォルトの名無しさん05/01/18 17:12:09
>490
_msizeのポートもできないくせに生
0492デフォルトの名無しさん05/01/18 17:14:11
>490
こいつはxmallocもVCも知らないぼけ
0493デフォルトの名無しさん05/01/18 17:19:37
>490
なめんなよ
0494デフォルトの名無しさん05/01/18 17:31:33
>490
おまいは簡単な変数の加算もできないのか
0495デフォルトの名無しさん05/01/18 17:44:52
自分で割り当てたメモリサイズは自分で管理汁。

                           それが標準Cクオリティ
       http://pc5.2ch.net/test/read.cgi/tech/1105454700/l50
0496デフォルトの名無しさん05/01/18 18:55:12
ヘボくても仕方ないよね
0497デフォルトの名無しさん05/01/18 19:40:00
>>490
ヒマ人に合わせてらんねーの
おぢさんたちわ
0498デフォルトの名無しさん05/01/18 20:01:30
>>497
やめとけ。
0499デフォルトの名無しさん05/01/18 20:08:19
> ダブルポインタで確保した多重配列の現在のサイズを取得したい
する必要はない。
0500デフォルトの名無しさん05/01/18 20:17:31
>>486
mallocで領域確保する時の要素数は変数の値が多いから無問題
0501デフォルトの名無しさん05/01/18 20:24:52
あらかじめ全体のサイズを計算していれば、malloc一回呼ぶだけでも二次配列のようなものは確保可能。
0502デフォルトの名無しさん05/01/18 20:33:13
VCが相当羨ましいようだな
0503デフォルトの名無しさん05/01/18 20:34:43
VCの問題なの?
0504デフォルトの名無しさん05/01/18 20:41:09
暇だったら>501のマクロか関数を書いてくんろ
0505デフォルトの名無しさん05/01/18 22:03:15
typedef char row_t[200];
row_t *buf1;
char (*buf2)[200];
buf1 = (row_t *)malloc(10*sizeof(row_t));
buf2 = (char(*)[200])malloc(10*200*sizeof(char));
0506デフォルトの名無しさん05/01/18 22:08:01
どなたかちょっと前(Part98だったかな?)
「これは左辺値ですか?」
「違います」
って感じのやりとりがあったと思うんです。あそこらのキャッシュ持ってないでしょうか?
持ってたらぜひにでも、あっぷお願いします。
0507左辺値がわかった人05/01/18 22:17:46
>>506
Part98該当箇所だけ
ttp://paw.s2.x-beat.com/up/img/4712.zip
0508デフォルトの名無しさん05/01/18 22:58:10
>>507
ご親切にありがとうございます!
無事ダウンロードさせて頂きました。
本当にありがとう!
0509デフォルトの名無しさん05/01/19 03:06:17
文字列の最後に改行を入れたいのですが
a[30]="\0"
とやっても改行が入らないのですがどうすればいいんでしょうか?
0510デフォルトの名無しさん05/01/19 03:09:37
そりゃあ改行は \n だからな。入れ方にも問題あるし。
0511デフォルトの名無しさん05/01/19 03:10:06
>>509
a[30] = '\n'; a[31] = '\0';
つーか、それエラーだろ。
0512デフォルトの名無しさん05/01/19 03:11:18
>改行

\0 は NUL
0513デフォルトの名無しさん05/01/19 04:21:43
pu
0514デフォルトの名無しさん05/01/19 04:41:37
だね。 > 512
0x00 NUL 0x10 DLE 0x20 SP
0x01 SOH 0x11 DC1
0x02 STX 0x12 DC2
0x03 ETX 0x13 DC3
0x04 EOT 0x14 DC4
0x05 ENQ 0x15 NAK
0x06 ACK 0x16 SYN
0x07 BEL 0x17 ETB
0x08 BS 0x18 CAN
0x09 HT 0x19 EM
0x0a LF 0x1a SUB
0x0b VT 0x1b ESC
0x0c FF 0x1c FS
0x0d CR 0x1d GS
0x0e SO 0x1e RS
0x0f SI 0x1f US 0x7f DEL
これぐらいは基本だ。おぼえとけ ぼけ
0515デフォルトの名無しさん05/01/19 04:42:18
513はかなりのしろーとの知ったかぶり ;-)
0516デフォルトの名無しさん05/01/19 04:47:49
man asciiすりゃ出てくるものを意気揚々と書かれてもなあ…
0517デフォルトの名無しさん05/01/19 04:54:09
はあ? それさもしらないやつが2人もいたから書いたわけだろ? やっぱり516のぼけは
自分のぼけをごまかせるとでも思っているようだ ;-)
0518デフォルトの名無しさん05/01/19 04:59:56
えーと516なんですが、私が他になにを書いたと?
0519デフォルトの名無しさん05/01/19 05:13:48
最近のがきはうざい、報告書は簡潔にね
0520デフォルトの名無しさん05/01/19 06:50:59
ようは、まぬけをさらしたのをごまかすために相手にケチをつけたかったのね ;-) > 519
0521デフォルトの名無しさん05/01/19 09:17:58
非公開関数って知ってます?
どんなの知ってます?
0522デフォルトの名無しさん05/01/19 09:22:54
>512
何の?
0523デフォルトの名無しさん05/01/19 09:23:33
>>433
Cの場合はvoid*はあらゆるポインタ型にキャスト無しで代入できるのですが.
0524デフォルトの名無しさん05/01/19 09:25:24
>522
誤爆。
>521
何の?
0525デフォルトの名無しさん05/01/19 09:33:14
>521
例えば公開ヘッダーの関数宣言を意図的に削ったり、関数定義にstaticを付ければ非公開だろ
0526デフォルトの名無しさん05/01/19 09:47:53
>>525
宣言を削っても非公開にはできないわけだが。
0527デフォルトの名無しさん05/01/19 11:08:55
>523 は本当?
けどキャストはした方がいくない?
0528デフォルトの名無しさん05/01/19 11:11:52
>521
_lock とか _unlock はマイクロソフトの非公開関数だよ ;-)
0529デフォルトの名無しさん05/01/19 11:23:09
すんません、初心者OKですか…?
入門書にて勉強中、やはりポインタで唸ってますが、
基本的な部分で疑問が生まれ、どこ読んでも書いてないもので…。

変数の宣言と代入なのですが、

int a=5;
int b=6;

または、

int a;
int b;
a=5;
b=5;

という記述はOKで、

int a;
a=5;
int b;
b=6;

という記述はなぜNGなんでしょうか?

諸先輩方、教えてくださいませ。お願いいたします。
0530デフォルトの名無しさん05/01/19 11:26:05
そんなはずはないよ
間違っているのは君の入門書だ。
0531デフォルトの名無しさん05/01/19 11:26:42
>529
int a=1;
は初期化を伴う宣言だ。代入文ではない。なお、C++では可
0532デフォルトの名無しさん05/01/19 11:28:00
>530
こいつの頭はC++
0533デフォルトの名無しさん05/01/19 11:28:52
>>529
Cでは
ローカル変数はスコープ(関数)の入り口の最初にしか
書けないことになっているから

C++だとどちらのやり方も書ける。
0534デフォルトの名無しさん05/01/19 11:29:31
C99ならNGじゃないよ。
0535デフォルトの名無しさん05/01/19 11:35:36
あ、ごめんなさい。

NGのやり方で記述すると、コンパイルエラーが起きるのです。

●コード
1 #include<stdio.h>
2 int main(void)
3 {
4int a;
5a=3;
6int b;
7b=5;
8
9printf("%dと%d\n",a,b);
10
11return 0;
12 }


●コンパイルエラー
6:parse error before 'int'
7:'b' undeclared (first use in this function)
7:(each undeclared identifier is reported only once
7:for each function it appears in.)

こんな感じです…。
053652905/01/19 11:39:13
>>531

初期化と代入を理解してませんでした。
ありがとうございます。


>>533

「最初に書け!」
というルールなのですね。
ありがとうございます。

今のところ「こういうルールだから」
というものには丸暗記で対応していこうと思っています。


みなさま、ありがとうございます。
0537デフォルトの名無しさん05/01/19 11:41:00
>>535
Cでは
ローカル変数はスコープ(関数(main))の入り口の最初にしか
書けないことになっているから

C++だとどちらのやり方も書ける。
0538デフォルトの名無しさん05/01/19 11:44:10
スレチガイ
すまん
0539デフォルトの名無しさん05/01/19 12:25:44
int a=1;
は初期化を伴う宣言だ。代入文ではない。なお、C++では可

激しく嘘 Cでも可 ;-)
0540デフォルトの名無しさん05/01/19 12:39:38
>>539
>int a=1;
>は初期化を伴う宣言だ。代入文ではない。なお、C++では可

>激しく嘘 Cでも可 ;-)

どこに嘘が?
Cで不可とはどこにも書いてないと思うのだが。
0541デフォルトの名無しさん05/01/19 12:43:10
>C++では可
Cでは不可ととれる
0542デフォルトの名無しさん05/01/19 12:55:26
昔のCではダメ。今のCではOK。
0543デフォルトの名無しさん05/01/19 12:59:21
>>542
なにこの人
054452705/01/19 13:01:24
だれか>>527に答えてください
0545デフォルトの名無しさん05/01/19 13:05:31
>>527
本当ですよ。
malloc() の返り値とかキャストするのは大マヌケ。
■ このスレッドは過去ログ倉庫に格納されています