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


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

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



1 名前:デフォルトの名無しさん [2008/04/29(火) 09:44:57 ]
言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 26
pc11.2ch.net/test/read.cgi/tech/1206196600/
過去スレ
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

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 105代目
pc11.2ch.net/test/read.cgi/tech/1208268461/


175 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:32:18 ]
>>165
どうも何かごかいしているね。
EOF = (-1) が定義されているとしてこの -1 は入力できない値(int)なのよ。getchar() などが EOF と判断した条件の時に文字として存在しない値 (int)-1 0xffff あるいは 0xffffffff が返されるものなのだから。。。判るかな?

176 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:37:27 ]
>>175
君ね、いい加減鬱陶しい。マクロを知らないのか?所詮、プログラム言語も仕様も
人間が都合よく定義、規格化しているだけ。EOFがどうとかどうでも良いんじゃい。
所詮 数値データ だと何度も言っているだろ。あとはマクロを使うことで
より幅広い環境で通用するという話。いい加減、大学にも通ってないような
低レベルとは話はしたくないんで。

177 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:38:13 ]
>>174
使えた。

178 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:39:06 ]
>>175
> この -1 は入力できない値(int)なのよ
これだけ取り出しても、こいつが相当な勘違い野郎だということがはっきりしたな。
入力の意味も広義で説明されていたというのに。ねぇ、こういう知ったかが
どこか政府が運営する機関の関係者にいたらどう思う?マジでやべーよ。
まぁ、こんな似非理系は当然、専門学校程度だろうけど。

179 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:46:30 ]
ttp://www.google.co.jp/search?q=EOF%E3%80%80%E5%85%A5%E5%8A%9B&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t
EOFの入力は余裕で可能です、ありがとうございますた。

180 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:47:14 ]
>>172
コメントの数字が正しいことはどうやって証明するんだよw

181 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:48:12 ]
>>180


182 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:50:47 ]
プログラムが扱う変数として、EOFの数値データをchar型などで扱うかまで
入力受付のライブラリを用いて話をするが、while(getchar()!=EOF); で
ループを止める際に、どうやって止めたいんだい、プログラムは?w
論点はそこじゃない。EOFが入力可能か?答えはYES。適切に処理しない
環境をいちいち持ち出されても迷惑。256色しか表現できない環境で
24ビット画像を正確に表示しようとしても無理なようにね。
くどいが、こんな目の前にある機械なんて、所詮人間がルール(規格)を決めて
定義されたとおりにコンピュータがデータを実装された能力に応じて
展開しているに過ぎない、人間が都合よく解釈できるように。
コンピュータには目の前の文字も画像も映像データも、0と1の塊にしか見えんよ。
あとは規則に則って処理しているだけ。

183 名前:166 mailto:sage [2008/05/02(金) 23:57:21 ]
>>173
ありがとう
何故か、当然変数で宣言できると思っててエラーでまくってた



184 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:57:49 ]
>>178
そんなむきにならならなくても。

185 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 23:59:05 ]
>>175
> この -1 は入力できない値(int)なのよ
別にint型とは限らなくね?符号ありのchar型にも収まる数値だが?

#include <stdio.h>
int main(void) {
char a=EOF;
unsigned char b=EOF;
if(a==EOF) printf("a=EOF\n");
if(b==EOF) printf("b=EOF\n");
printf("a : %d / b : %d \n",a,b);
return 0;
}


186 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:10:02 ]
さすがにそれはないわw

187 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:29:06 ]
>>185
fgetc(), getc(), getchar() の返り値は int ですから、EOF (-1) はファイル中に存在する値でも
なければ、stdin から入力できる値でもないと思うのですが。

188 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:30:53 ]
>>185
ああ、ようやく普通の人にであえたきが・・。勘違い >>182 系に辟易だったので・・・
で、実はそうではない。上位ビットが負号を示すのに用いられてるわけだけど
負号無しの unsigned char の場合 0x00 = 0, 0xff = 255 になって
負号付きの signed char の 0x80 〜 0xff は -127 〜 -1 とするから -1 という意味合いはある。
だけどこの -1 を EOF とみてしまうと・・・それはとても困る。
なぜなら(0x00〜0xff) の範囲にあるものすべて扱えないといけないから。
(0xff)が出現するバイナリーファイルの入出力はできないって事になるでしょ?

キーボードなどから (int(-1)) を入力できないデバイスはどうしたらいいかって事になるけど何度も既出だけど ^D (0x04) を犠牲にしそれを終端と意味付け、これをみて intサイズの -1 を返すという決めをしてる。

例で挙げている char a = EOF; の行でコンパイラから警告がでていない?(オプションによるけども char = int とするときの警告文)
後の比較系は int に負号拡張されるから見かけ動くようにみえてしまうので誤解しやすい。
0x7f (char) が 0x0000007f (int) に・・・同じ値 127 となる。
0x80 (signed char) が 0xffffff80 (int) に・・同じ -127 となる。
0x80 (unsigned char) は 0x000080 (unsigned int) ・・ 128・・という具合に・・
上位ビットを負号ビットに割り当てたのは負号拡張がとても容易だから。
a b が printf に渡った時点で負号拡張された int となっているからね。

189 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:32:33 ]
#include <stdio.h>
int main(void) {
char a=EOF;
unsigned char b=EOF;
int aa=EOF;
unsigned int bb=EOF;
if(a==EOF) printf("a=EOF\n");
if(b==EOF) printf("b=EOF\n");
printf("a : %d / b : %u \n",a,b);
printf("aa : %d / bb : %u \n",aa,bb);
return 0;
}

後は受け付けた変数の型によって、それ相応に解釈されちゃってるけどね。

190 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 00:44:20 ]
>>188
暴れてるのは一人だけで、まともに相手にすると余計暴れるからスルーしてるだけ

191 名前:デフォルトの名無しさん [2008/05/03(土) 01:01:03 ]
正直ここで何か聞こうかと思ってスレちょっと読んだが
「C言語きやすく質問おk」と書かれた扉を開けたら
腕組んでイライラした奴らがこっちを見て来た状況と同じくらい
質問しづらいんだが。


192 名前:デフォルトの名無しさん [2008/05/03(土) 01:22:02 ]
喋り方がむかつくってだけで正しい意見に対して脊髄反射で反論始めるとこうなるって良い見本だなw

193 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:33:53 ]
>>183
おっ、丁寧に。サンプル間違ってたけどそこはなんだ。うまく修正してくれたわけか。C99 あるいは今の GNU C/C++系だと気付かなかった世界かもしれん。再変更する realloc もあるで。



194 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:53:55 ]
>>191
あ!?んだよ!?

195 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 01:59:58 ]
放置のできないバカはプログラム以前のことを勉強しなおせ

196 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:41:22 ]
IDの出ない板はNGにしにくくて困る
いっそコテハンつけてその話題をやって欲しいんだが

197 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:47:00 ]
とりあえずEOFをNGワードにすればおk
来月ぐらいまで我慢すれば飽きるでしょ

198 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:54:18 ]
ちょ、宿題スレで解答書くときEOF使うから困るw

199 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 03:55:41 ]
どうしても駄目なときはうpろだ使え
むしろsizeofを間違ってNGしないように気をつけろ

200 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 04:57:32 ]
EOFで騒いでいるキチガイ様はこちらの一等席(最高に頭の悪い発言をしてくださいスレ)へどうぞ
pc11.2ch.net/test/read.cgi/tech/1179394713/l50

201 名前:デフォルトの名無しさん [2008/05/03(土) 08:33:17 ]
--- EOF

202 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 10:55:48 ]
ポインタ文字列、char* p = "ABCDE";
って場合は
p[0] = 'F';
って変えれないんだよね?
char num[80] = "ABCDE";
char* p = num;
ってポインタが文字列のはいった「配列」をさしてないと
ポインタに添え字つけて一文字代入するのは無理?

203 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 11:01:29 ]
うん。規格の範囲内では無理ってことになってる。



204 名前:202 mailto:sage [2008/05/03(土) 11:04:39 ]
>>203
ありがとう
サンプルソースがなぜかポインタ文字列を直接操作してて
エラーでまくるから、自分の環境が悪いと思い込んでた
サンプルが間違ってたって事だね

205 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 12:21:00 ]
正確には未定義じゃなかったっけ

運が良ければ動くけどやるべきじゃないね

206 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 14:08:20 ]
ポインタといえばちょっと前の zdnet builder の記事も酷かったな。
202のサンプルと同じ間違いもしっかり犯してたし。

207 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:24:32 ]
>>206
過去形にするなや。未だに「レビュー中」のままだぞ。

208 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:43:08 ]
>>207 なんでこいつ偉そうなの?w

209 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 16:48:07 ]
自分の意に沿わない発言は全て「偉そう」ですか。大儀ですな。

210 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:01:49 ]
大儀である。下がってよいぞ

211 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:04:02 ]
大昔、リテラル文字列をいじっていい時代があったんだよ・・・。
リテラル文字列を char* に代入できるのはそれとの互換性のため。
今はもちろんいじっちゃいけないが。

いじっちゃいけないようにすることで、
同じリテラル文字列が登場したらそれを共通化できるようになるし、
もっと言えば "ABC" と "BC" みたいなのも共通化できるようになる。

212 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:12:22 ]
いやリテラル文字列は const char* constだから
普通にchar*に代入して参照できるわけだが。

213 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:19:39 ]
>>212
おかしなこと言わない。
リテラル文字列は const char の配列であってポインタじゃないし
(sizeof でサイズを取得できるから)、
char* に代入できるのは 「文字列リテラルは char* に代入できる」 という仕様が
特別に用意されているから。



214 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:20:47 ]
const char* constってchar*に代入できたっけ?

215 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:21:06 ]
>>213
おしい、後一歩だ、がんばれ


216 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:23:10 ]
char* に暗黙にキャストできる、と言った方が良かったか。

217 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:32:05 ]
>>207
過去形じゃないよ。現在完了形だよ。

218 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:43:46 ]
>>216
ここのところずっとC++しか触ってないからできないもんだと思ってた
Cだと警告しか出ないのね

219 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:46:24 ]
なんか大卒の奴にいい負けしてかなり悔しいのぅ悔しいのぅな
時代遅れのオッサンが、GW中にどこにも出かけられないから
ここで楽しんでいたところ、気分を悪くしてしまったようでw

220 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:53:58 ]
>>218
チガウチガウ
リテラル文字列を char* に暗黙にキャストできるという話。
これは C も C++ も同じ。

221 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:55:57 ]
EOFの次はchar*にリテラル文字列ですか。とことん暇な人が多いですね。

222 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:57:54 ]
EOF って何の話?

223 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 17:59:09 ]
Eroi Oneesan Fujikochan



224 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:01:17 ]
 EOF<ガオー
  人

225 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:01:49 ]
>>220
「リテラル文字列は const char* const」
「const char* constは普通にchar*に代入して参照できる」
だからリテラル文字列は普通にchar*に代入できるって意味の発言だと思ったんだが
私が単に読み間違えただけか。

226 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:08:48 ]
普通はconst外ししようと思ったらキャストがいるけど、const char* const→char*だけは歴史的な理由によりそれが要らないってことだろ。

227 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:12:37 ]
>>225
>「const char* constは普通にchar*に代入して参照できる」
こんなこと212しか言ってないような、
そして>>220=216=214と>>212は別人のような気がする。

228 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:15:30 ]
>>214>>218>>225が私で、
>>212>>216>>220が同一人物だと思ってたんだけど
それがすでに勘違いだったのか orz こりゃまた失礼しました

229 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:38:13 ]
ttp://www.sgnet.co.jp/c/2-1.htm
ここのサイトで

#include <stdio.h>
void main()
{
printf( "好きなことを書きましょう" );
}

ってなっているので、実際にやってみると
testa.c:1: error: missing terminating " character
testa.c: In function `main':
testa.c:3: warning: return type of 'main' is not `int'
というふうにエラーがでます。

で、大学では

#include <stdio.h>
int main(void)

って習ったのですが、どう違うんですか?こっちではうまくいったのですが。

230 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:40:19 ]
Cの初心者なんですが、コマンドプロンプトに関して
質問があります。
こちらで聞いてよろしいんでしょうか??

231 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:41:49 ]
>>229
そのコンパイラが日本語に対応してないんじゃね?

232 名前:229 mailto:sage [2008/05/03(土) 18:44:18 ]
>>231
あ、すいません。

#include <stdio.h>
int main(void)
{
printf("好きなことを書きましょう");
}

で、うまく実行できたという意味です。

233 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:44:52 ]
素早い返答感謝です。
実行すると、内部ファイル云々、操作可能なプログラムと
認識されていません、と出ました。
内定先から頂いたDISCの指示に従ってインストールしたんですが・・・・



234 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:46:24 ]
何の話か知らないが内定先に聞けよ

235 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:46:26 ]
>>232
ttp://www.kijineko.co.jp/tech/superstitions/void-main.html

236 名前:229 mailto:sage [2008/05/03(土) 18:50:11 ]
>>235
難しすぎてわからないのですが…

ようは、void main() と int main(void) は同じような意味だから
できたほうを使えってことですか?

237 名前:デフォルトの名無しさん [2008/05/03(土) 18:53:32 ]
C++とCで仕様がちがうのでは?

238 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:55:36 ]
>>236
戻りはint。引数は依存って書いてあるな。void main(void)は不可か

239 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:58:44 ]
>>236
全部
int main
でおk

240 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:01:50 ]
>>229

そのサイトが嘘つき、もしくは正しい知識をもってない。
大学のほうが正解。


241 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:05:22 ]
あとint mainでやるなら
正常終了したって事を示す「return 0;」を忘れずに

242 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:08:20 ]
C99 なら大丈夫だけどね。
まだ C89 の環境多いから return 0; 書いた方がいいけど。

243 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:13:18 ]
>>232 みたいなちょっと「動作確認しました」くらいのやつならC89でもreturn 省略してもいいよ。
逆に、いちいちつっこむヤツを見ると、省略できるの知らないの? って思う。




244 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:15:48 ]
質問します。
Linuxのコンソールで擬似和音のビープ音鳴らすのにエスケープシーケンスを
使おうとおもってるんですが、printf関数でエスケープシーケンスを
出力すると、一旦出力バッファに貯められてしまうため、時間差で
音を出したくても上手く音が出力されません。

出力バッファを介さずに文字列を出力する関数ってなにかありますでしょうか?

245 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:31:43 ]
>>243
return を省略した際の動作は規格上は未定義。
C99 や C++ だと main 関数は特例として省略が可能だが、
C89 では main 関数にもそれが適用される。
大体の処理系は警告出すだけだがね。

246 名前:230 mailto:sage [2008/05/03(土) 20:03:24 ]
妙な事をきいてしまってすみません。内定先もGW中で
担当の方がいらっしゃらない物で。
失礼しました。


247 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:10:18 ]
>>245
動作が未定義ってかリターン値が未定義だろ。
省略しても問題ないよ。
お作法的には書くほうがいいけど、書き捨てのコードにいちいちツッコミ入れるほどじゃないよ。

248 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:17:00 ]
>>244
Drawin / *bsd 系なので Linux はどうかしらないが fflush 使うか raw モードにするというのももある

// うまく管理して
{
 int fd;
 struct sgttyb bk, fm;
}


{
 if((fd = open("/dev/tty", O_RDWR)) == -1)
  return -1;

 ioctl(fd, TIOCGETP, &bk);

 fm = bk;
 if(fm.sg_flags != RAW)
 {
  fm.sg_flags = RAW;
  ioctl(fd, TIOCSETP, &fm);
 }

read(fd write(fd でどちらもバッファリング無しで入出力...


249 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:22:02 ]
>>236

int main() { .... ; return 0; } ですればどうでしょうね。
return 無しの例外が許されてるといいながら return 0; 記述がそれほど手間でもないのでは?

void main() の登場はいわゆる void 型が導入された次期からしばらくの間ではなかったか。サンプルが古いのであって目くじら立てずに見過ごせばどうかな?。

250 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:25:31 ]
めくじらっつーか、gcc じゃコンパイル通らんし。

251 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:37:49 ]
>>250
だから int main に読み替えればいいでしょって事なの。参考にしてる物に目くじら立てて(その例文は可笑しい)って作者に文句のメールでも送る?。そんな方向に行くのはどうかという事。

252 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:38:49 ]
>>251
仮にも 「講座」 を名乗るのにそれじゃマズいだろ。

253 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:41:52 ]
問題はおかしいかおかしくないか判断できない初心者がそれを読むってことだろ



254 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 20:58:37 ]
そうガミガミすんなや、GWも後半に入ったというのに
# 自分はどこにも行きませんけど

255 名前:229 mailto:sage [2008/05/03(土) 20:59:37 ]
いろいろな回答ありがとうございます

大学で3回くらいしかまだ習ってないので(習ったのはprintf int forとかだけですけど)
ばりばり初心者だったのですいません

とりあえず普通に勉強していこうと思います

ありがとうございました

256 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:35:52 ]
質問です。
下のコードは書いているものの一部なのですが、
コメントのつけてある位置でエラーが出てしまい、コンパイルが通りませんでした。

typedef struct {int line, *col;} match_info;
match_info *info;

match_info *str_search(FILE *fp, char *sstr)
{
 int line_cnt;
  ....                     // line_cntはここで値が代入されている
 info = (match_info *)malloc((line_cnt+1) * (sizeof(match_info)));
 info+line_cnt = NULL;           // ここでエラー
  ....
}

エラーの内容は
error: invalid lvalue in assignment
でした。ちなみにinfo = NULLとしたところコンパイルできました。
info + 1 = NULLと定数を使用するとやはりコンパイルできません。
何故オフセットすると値を代入することができなくなってしまうのでしょうか。
お願いします。
(エラーの出ている箇所はこの部分だけであり、載せていない部分ではエラーはありませんでした)

257 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:38:03 ]
>>256
infoはポインタでしかないから、それに何かを足したものはただの値でしかないから代入はできない。
やりたいことは、info[line_cnt] = NULLではないのか?

258 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:39:34 ]
*(info + line_cnt)

259 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:42:39 ]
>>257
ないな。match_infoが構造体だから代入できない。
まぁ恐らく、
info[line_cnt].line = 0;
info[line_cnt].col = NULL;
なのだろう。

260 名前:デフォルトの名無しさん [2008/05/03(土) 21:56:30 ]
うるせええええええええええええええええええぞ
かすどもおおおお

スレ違いなんだよ他でやれ

261 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 21:58:05 ]
だからもちつけって
(オレモナー)

262 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:09:21 ]
>>257-259
お早いレスありがとうございます。
やりたいことは確かに>>259の通りなのですが、
他の関数でinfoを門番までスキャンさせたくて、門番としてNULLを割り当てようとしました。
ちょうどコマンド引数のargv[argc]に'\0'が入っているような感じに使おうと思っているのです。

>>259のようにしてしまうと、他の関数ではinfoのメンバーを知らなくてはなりません。
質問では触れなかったのですが、検索用の関数を作っています。
最終的には、main()側でstr_search()や,infoの内容を見る関数をラップした関数を使えるようにするだけで、
他の部分は全てヘッダファイルに移し、隠蔽してしまおうと考えていました。(言葉足らずですみません)
つまりinfoは作業用変数としたいのです。

関数の設計も含めて、何か良い方法がありましたら教えていただけないでしょうか。

263 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:11:47 ]
最後の要素のcolかlineに特別な値を割り当てておくしかないだろう



264 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:14:33 ]
>>262
できない。
infoが配列の要素を指している以上、
その値は必ず配列上に存在する要素へのポインタにしかなりえない。


265 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:16:02 ]
あとはline_cntを公開しておくしかないな
こーゆーことやるならC++のほうが圧倒的に楽だけどね…

266 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:18:13 ]
>262
文字列の最後を\0で検出できるのは、\0が文字型の特殊な値だから。
同じように任意の型の配列の末尾を検出したいなら、特殊な値を割り当てて検出する以外にない。

267 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:22:50 ]
どうしてもやりたいなら、 match_infoの配列ではなく、
match_infoのポインタの配列を使う。

 match_info **info;

 info=(match_info **)malloc((line_cnt+1) * (sizeof(match_info *)));
 for(i=0;i<line_cnt;i++)
  info[i]=(match_info *)malloc(sizeof(match_info));
 info[line_cnt]=NULL;

こうすれば出来るけど、当然一個一個freeする手間がかかる。

268 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:24:02 ]
>>262
argv[argc]は'\0'ではなくNULLな。
これはargvがポインタの配列だから実現できる。
infoはmatch_info型の配列だから、
末尾要素をNULLにしようとしても型が違う。

269 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:28:56 ]
>>256
それはもしかするとこう?


match_info** info;  // ← match_info の配列ですね?

{
 info = (match_info**)malloc(line_cnt+1)*szeof(match_info));

 int i;
 for(i = 0; i < line_cnt + 1; i++)
  info[i] = NULL+
 // ...


270 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:30:16 ]
>>267
ががん。かぶってしもた・・

271 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:33:43 ]
構造体の中身を公開したくないのに構造体の内容で判定することはできない。
公開するか、ポインタの配列で実現するかの二択。

272 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 22:57:51 ]
>>263-271
みなさんありがとうございます。

argv[]がargv[argc]までスキャンされるのは、
argv[]が文字列の"ポインタ"だからですね。勘違いしていました。
>>267>>269でおっしゃられているようにポインタ配列で実装しようと思います。

>>267>>269のようにmalloc()がネストされている場合は、
中をfree()してから外側をfree()しなければなりませんか?
手間がかかるようなら、>>263,265も考えてみようと思います。

273 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:07:18 ]
>>267>>269のようにmalloc()がネストされている場合は、
|中をfree()してから外側をfree()しなければなりませんか?
もちろん



274 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:17:03 ]
正規表現のアルゴリズムを勉強したいんスけど、なんかグレートなテキストってないっスかねぇ〜?

275 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:23:46 ]
>>274
エディタのマニュアルに書いてないかな






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

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

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