C言語なら俺に聞け( ..
[2ch|▼Menu]
232:229
08/05/03 18:44:18
>>231
あ、すいません。

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

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

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

234:デフォルトの名無しさん
08/05/03 18:46:24
何の話か知らないが内定先に聞けよ

235:デフォルトの名無しさん
08/05/03 18:46:26
>>232
URLリンク(www.kijineko.co.jp)

236:229
08/05/03 18:50:11
>>235
難しすぎてわからないのですが…

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

237:デフォルトの名無しさん
08/05/03 18:53:32
C++とCで仕様がちがうのでは?

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

239:デフォルトの名無しさん
08/05/03 18:58:44
>>236
全部
int main
でおk

240:デフォルトの名無しさん
08/05/03 19:01:50
>>229

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


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

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

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


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

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

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

246:230
08/05/03 20:03:24
妙な事をきいてしまってすみません。内定先もGW中で
担当の方がいらっしゃらない物で。
失礼しました。


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

248:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/03 20:22:02
>>236

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

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

250:デフォルトの名無しさん
08/05/03 20:25:31
めくじらっつーか、gcc じゃコンパイル通らんし。

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

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

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

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

255:229
08/05/03 20:59:37
いろいろな回答ありがとうございます

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

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

ありがとうございました

256:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/03 21:38:03
>>256
infoはポインタでしかないから、それに何かを足したものはただの値でしかないから代入はできない。
やりたいことは、info[line_cnt] = NULLではないのか?

258:デフォルトの名無しさん
08/05/03 21:39:34
*(info + line_cnt)

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

260:デフォルトの名無しさん
08/05/03 21:56:30
うるせええええええええええええええええええぞ
かすどもおおおお

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

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

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

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

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

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

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


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

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

267:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/03 22:24:02
>>262
argv[argc]は'\0'ではなくNULLな。
これはargvがポインタの配列だから実現できる。
infoはmatch_info型の配列だから、
末尾要素をNULLにしようとしても型が違う。

269:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/05/03 22:30:16
>>267
ががん。かぶってしもた・・

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

272:デフォルトの名無しさん
08/05/03 22:57:51
>>263-271
みなさんありがとうございます。

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

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

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

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

275:デフォルトの名無しさん
08/05/03 23:23:46
>>274
エディタのマニュアルに書いてないかな

276:デフォルトの名無しさん
08/05/03 23:27:29
>>274
grepのソース

277:デフォルトの名無しさん
08/05/03 23:34:41
>>274
URLリンク(www.amazon.co.jp)

この本に一章だけ書いてある。
本自体は有名だけど、この説明がいいかどうかは判断できない。

278:デフォルトの名無しさん
08/05/03 23:40:46
>>277
レビューワロタ
参考にしてる人多すぎだろ

279:デフォルトの名無しさん
08/05/03 23:40:52
「詳説 正規表現」のコラムでも、正規表現をさらに学びたい人は >>277 の三章を進めると書いてあるな。

280:デフォルトの名無しさん
08/05/04 00:05:26
せっ・・・性器表現の勉強を(ry お勧めの参考書を(ry

281:デフォルトの名無しさん
08/05/04 00:21:41
>>274
手元にある本をあげておきます。
オートマトン・言語理論, 富田悦次・横森 貴, 森北出版 1992, ISBN4627805500
これがベストというわけではありませんが、まず理論的な部分をしっかりおさえておかないと、後々どうにもならなくなると思います。

282:デフォルトの名無しさん
08/05/04 03:45:27
#include のことを、シャープインクルードって言っていた香具師、手を上げろ! ノシ

283:デフォルトの名無しさん
08/05/04 03:50:06
えっ、違うの!?

284:デフォルトの名無しさん
08/05/04 03:52:10
本場の職人なら、パウンド・インクルードという。

285:デフォルトの名無しさん
08/05/04 03:52:32
# #は井桁、ナンバーサインでシャープは♯なんだな。
斜めになっているのが縦棒か横棒か、違うんだなぁ。
シャープは楽譜の記号で使われているんだなぁ。
ぼぼぼ、僕はおにぎりが欲しいんだなぁ。

286:デフォルトの名無しさん
08/05/04 04:18:42
C#とかあるし、シャープで伝わるからそう読んでるな
むしろ井桁とかだと通じないことがあるし

287:デフォルトの名無しさん
08/05/04 04:29:29
シーナンバー・・・うむ・・・いや、いや、そうじゃなくて、C♯はちゃんと
シャープと書かれているんでしょう。同一視してはならぬ、決して。

288:デフォルトの名無しさん
08/05/04 04:35:23
C#は間違いなく井桁だな
まぁシャープの代わりに井桁を使っているから、井桁をシャープと読むのは不適切かも知れないが

井桁が通じないことがあるんだからしょうがない
もっと普及させてこい。話はそれからだ

289:デフォルトの名無しさん
08/05/04 04:42:53
♯の半角が存在しないから、代用しているのさ・・・そう思いたい・・・きっとそうだ。
♯を英語圏にも広めよう!

290:デフォルトの名無しさん
08/05/04 07:35:58
>>284
マジなのか
どうでもいいけど
URLリンク(cplusplus.syntaxerrors.info)

291:デフォルトの名無しさん
08/05/04 09:46:44
英語だといろんな呼ばれ方があるみたいだ。「シャープ」も含めて。

URLリンク(en.wikipedia.org)


292:デフォルトの名無しさん
08/05/04 10:17:44
値のビット列表示をしたいのですができません
共用体とビットフィールドを使って実現しようと思ったのですができませんでした
下のプログラムだとどこがだめなんでしょうか?

#include <stdio.h>

int main(void){
union bits{
char ch;
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
} bits;

bits.ch = 'a';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);

bits.ch = 'b';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);

bits.ch = 'c';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);

return 0;
}

/*
実行結果:
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
*/

293:デフォルトの名無しさん
08/05/04 10:18:38
fgets(str, 32, fp);
こんな感じに書いたときに、
strの宣言がcharの配列だったらいいけど、
charへのポインタだったらだめだった。どうして?

294:デフォルトの名無しさん
08/05/04 10:31:08
>>293
運が悪くポインタの指す先が書き換えてはいけない場所だったから

295:デフォルトの名無しさん
08/05/04 10:54:19
>>292
a, b, c, d, e, f, g, h が union で共用されているから

#include <stdio.h>

int main(void){
union bits{
char ch;
struct{
unsigned a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
};
} bits;

bits.ch = 'a';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);

bits.ch = 'b';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);

bits.ch = 'c';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);

return 0;
}

296:デフォルトの名無しさん
08/05/04 10:56:19
>>293
ポインタを初期化していなかったに一票

297:293
08/05/04 11:04:20
>>294
>>296
そうだよね、何処にあるかわからない入れ物を渡してもダメに決まってるよね。
すっきりしますた。

298:デフォルトの名無しさん
08/05/04 11:10:44
>>295
unsigned とかやってるとサイズが4バイトになるから

union bits{
 char ch;
 struct{
  unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
 };
} bits;

にしないとマズいかもしれない。
ただ、ビットフィールドを含む構造体のサイズは処理系依存なので難しい所だが。

さらに言えばビットフィールドのビットがどちら側から埋められるかは処理系依存だから、

union bits{
 char ch;
 struct{
#ifdef BITFIELD_LITTLE_ENDIAN
  unsigned char h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1;
#else
  unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
#endif
 };
} bits;

として処理系ごとに切り替えられるようにするのが良い。

299:デフォルトの名無しさん
08/05/04 11:13:03
unsigned char に対応していない処理系を考慮するなら

union bits{
 char ch;
 struct{
#ifdef BITFIELD_LITTLE_ENDIAN
#ifdef BITFIELD_INT_SIZE
  unsigned : sizeof (unsigned int) * CHAR_BIT - 8;
  unsigned h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1;
#else
  unsigned char h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1;
#endif
#else
#ifdef BITFIELD_INT_SIZE
  unsigned a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
#else
  unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
#endif
#endif
 };
} bits;

とすることになるが、この共用体のサイズが1であることは期待できない。

300:デフォルトの名無しさん
08/05/04 11:28:45
>>295,298,299
ビットフィールドが全部同じ位置を使っていたということですね
プリプロセッサディレクティブは未学習なのですが、イメージはつかめました
ありがとうございました


301:デフォルトの名無しさん
08/05/04 12:05:18
1ビットしかなくて読むだけなのにビットフィールドの共用体なんてフツー使わねえよ。

#define BIT(val, pos) (((val) >> (pos)) & 1)

int ch;
ch = 'a';
printf("%d %d %d %d %d %d %d %d\n", \
BIT(ch,7), BIT(ch,6), BIT(ch,5), BIT(ch,4), BIT(ch,3), BIT(ch,2), BIT(ch,1), BIT(ch,0));


302:デフォルトの名無しさん
08/05/04 12:08:57
>>301
普通って何さ

303:デフォルトの名無しさん
08/05/04 12:38:48
>>302
普通って普通さ

304:デフォルトの名無しさん
08/05/04 13:43:24
まあ確かにビットマスク使ったほうが楽だな

305:デフォルトの名無しさん
08/05/04 17:45:50
コマンドプロントでテキストファイル.Cをコンパイルするにはどうすればいいの?
パスはしたの通りです。
C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
C:\Bディレクトリ\コンパイラ



306:デフォルトの名無しさん
08/05/04 18:18:23
> コンパイラ /?
> コンパイラ /H
$ コンパイラ -h
$コンパイラ --help

307:デフォルトの名無しさん
08/05/04 18:53:08
えwどういうことw

308:デフォルトの名無しさん
08/05/04 18:55:18
>>307
コンパイラによって方法が違うからコンパイラのマニュアルを見るか
有名なコンパイラなら名前を書け

309:デフォルトの名無しさん
08/05/04 18:55:53
ヘルプ見ろ

310:デフォルトの名無しさん
08/05/04 19:05:39
え そうなんだ
MinGWなんだけど

311:デフォルトの名無しさん
08/05/04 19:12:19
MinGWならgccかな
> C:\Bディレクトリ\コンパイラ
が気になるけどたぶん
gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
どっちかかもね?

312:デフォルトの名無しさん
08/05/04 19:20:27
gcc --help
と叩けば使いかたが出る。

313:デフォルトの名無しさん
08/05/04 19:31:39
> C:\Bディレクトリ\コンパイラ は C:\TYC4TH\gcc ってことです
その二つでためしたんですが、
gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cの場合
'gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cだと
'C:\TYC4TH\gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません


314:デフォルトの名無しさん
08/05/04 19:33:02
ってでます><

315:デフォルトの名無しさん
08/05/04 19:39:10
>>312
なんか英語がたくさんでて意味がわからない・・・


316:デフォルトの名無しさん
08/05/04 19:42:10
日本語を含む場合は""で括る
例)gcc "C:\Bディレクトリ\コンパイラ"

>'gcc' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
gccコマンドのパスが通っていない、正しくない

317:デフォルトの名無しさん
08/05/04 19:49:07
gccインストールしてからMinGWインストールすると
パス通すかの確認があった気がしたけど・・・
MinGWをインストールしなおして確認してみるか、
$HOME/.bashrcにexport PATH=$PATH:コンパイラの入ってるディレクトリ
を追加してみ
MinGWコンパイラの入ってるパスは$HOMEからの相対パスがいいかな

ちなみにMSYSも入れるとうれしくなれるかも

318:デフォルトの名無しさん
08/05/04 19:49:48
>MinGWコンパイラの入ってるパスは
コンパイラの入ってるパスは

訂正

319:デフォルトの名無しさん
08/05/04 19:51:13
>コンパイラの入ってるパスは
コンパイラの入ってるディレクトリは
打つ出し脳

320:デフォルトの名無しさん
08/05/04 19:51:51
MinGW - Minimalist GNU for Windows
OSはWindowsじゃないの?
XP なのか 9x なのかによっても設定方法違うけど

321:デフォルトの名無しさん
08/05/04 19:55:06
c:\autoexec.batに
PATH=c:\MinGWまでのディレクトリ\bin;%PATH%
これを書き込んで再起動すればばよかった、、、はず・・・多分

322:デフォルトの名無しさん
08/05/04 19:57:08
折角隔離スレがあるんだから誘導しろよ。
Cygwin + MinGW + GCC 相談室 Part 3
スレリンク(tech板)

323:デフォルトの名無しさん
08/05/04 20:19:39
おぉ できたかもです!!
みなさんありがとうございます。
さっそく勉強してきます。

324:デフォルトの名無しさん
08/05/04 20:51:46
#include <windows.h>

typedef HRESULT (STDMETHODCALLTYPE *LPFNGETCORSYSTEMDIRECTORY)(LPWSTR, DWORD, DWORD *);

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
WCHAR szBuf[256];
DWORD dwLength;
HMODULE hmod;
LPFNGETCORSYSTEMDIRECTORY lpfnGetCORSystemDirectory;

               略

lpfnGetCORSystemDirectory = (LPFNGETCORSYSTEMDIRECTORY)GetProcAddress(hmod, "GetCORSystemDirectory");
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (lpfnGetCORSystemDirectory == NULL) {
MessageBox(NULL, TEXT("関数がエクスポートされていません。"), NULL, MB_ICONWARNING);
FreeLibrary(hmod);
return 0;
}
               略
}

上記のようなプログラムを見かけましたが波線の部分関数ポインタの動作いまいち理解できません。
どなたかご教示お願いします。

325:デフォルトの名無しさん
08/05/04 21:53:20
>>293
以下の記述で普通に動作しています。
環境 cygwin/WindowsXP, 処理系 gcc 3.4.4
#include <stdio.h>
#define N 1024
int main()
{
char buffer[N], *p;
p = buffer;
fgets(p, N, stdin);
printf(">%s", p);
return 0;
}
/* end */
動作しないソースと環境・処理系を教えていただければ、何かわかるかもしれません。

326:325
08/05/04 21:54:30
失礼、解決ずみでした。

327:デフォルトの名無しさん
08/05/05 01:40:56
>>324
関数ポインタとは動作するものではありません
もう少し質問内容を吟味してくださらないと答えようがありません

328:デフォルトの名無しさん
08/05/05 04:08:44
>>81ってどうやるのかな

329:デフォルトの名無しさん
08/05/05 06:47:41
>>324

何を聞きたいのか今ひとつわからんが、とりあえずMSDN。
URLリンク(msdn.microsoft.com)(VS.80).aspx


330:デフォルトの名無しさん
08/05/05 13:03:48
>>324
GetProcAddress は指定した関数へのアドレスを返すんだけど、
GetProcAddress の戻り値の型は1つに定めないといけないので
GetProcAddress は関数へのアドレスをとりあえず FARPROC って型にして返すようにしてある。
実際にこの関数のアドレスを使う際には、
本来の関数ポインタ型へとキャストして使う必要がある。

331:デフォルトの名無しさん
08/05/05 14:15:49
stdlib.hにあるsystem関数って、標準ですか?
どの処理系でもまともな動作が期待できる?

332:デフォルトの名無しさん
08/05/05 15:04:12
>>331
プログラマを目指すならもちとあいまいな問いにならないよう気をつけないと。
質問がとんでもなく飛んでいる。
どの処理系・・・列記してみて
まともな動作・・まともってなによ(この質問はちょっとあほっポイ匂い)

333:デフォルトの名無しさん
08/05/05 15:19:24
>>331
標準じゃない

334:デフォルトの名無しさん
08/05/05 15:25:08
>>324
このソースって凄いね(大文字ばっかで・・・w)
関数のポインターについてだけど
ポインターはアドレスを示すのは判りますね。

int body1(char* mes)
{
 printf("body1 : %s¥n", mes); return 0;
}

int body2(char* mes)
{
 printf("body2 : %s¥n", mes); return 0;
}

{
 int (*func)(char*);
 func = body1;
 func("message");

 func = body2;
 func("message");
}

みたいな。
lpfnGetCORSystemDirectory は関数へのポインターを示すけど希望するのがなければ NULL。
あとlpfnGetCORSystemDirectory() として適当に引数与えて呼び出せばいいということかな。

335:デフォルトの名無しさん
08/05/05 15:57:10
>>331
関数そのものは標準であり、
どの処理系であろうと「処理系の考えるところのまともな動作」をする
それが「プログラマの期待するところの動作」と一致するかはわからない

336:デフォルトの名無しさん
08/05/05 16:02:52
ここのレス見ても何も分からないほどの初心者ですが教えてほしいことがあります。
課題でこのプログラムを組まないといけないのですが、全く分かりません。

問、二次元配列のプログラムを利用し、行列の積を計算するプログラムを作成せよ。
ただし行列a,bは以下のものを使用する。
|0 1 2| |0 3 6|
a=|3 4 5| b=|1 4 7|
|6 7 8| |2 5 8|
aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。

337:デフォルトの名無しさん
08/05/05 16:12:06
>>336
>aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
行列の積の定義から勉強しような。
行と列が逆だと思うぞ。


338:デフォルトの名無しさん
08/05/05 16:23:36
>>337
すいません。丁寧に指摘してくださってありがたいです。
一応僕が作ったプログラムを載せておきます。
#include<stdio.h>
main(){
int a[3][3]={{0,1,2},{3,4,5},{6,7,8}};
int b[3][3]={{0,3,6},{1,4,7},{2,5,8}};
int c[3][3]={0};
int i,j;


for(i=0;i<3;i++){
for(j=0;j<3;j++)
c[i][j]=a[i][j]*b[i][j];}
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d ",c[i][j]);
printf("\n");
}}
足し算をするプログラムの演算子を+から*に変えただけなので積が出来るわけもないのですが、
どうすればよいのでしょうか、あつかましいですがよろしくお願いします。

339:側近中の側近 ◆0351148456
08/05/05 16:28:36
(っ´▽`)っ
#include <stdio.h>

int main(void)
{
  int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
  int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}};
  int ab[3][3];
  int i;
  int j;
  int k;
  for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++){
      ab[i][j] = 0;
      for(k = 0; k < 3; k++){
        ab[i][j] += (a[i][k] * b[k][j]);
      }
    }
  }
  return 0;
}

答えは{{5, 14, 23}, {14, 50, 86}, {33, 86, 149}

340:デフォルトの名無しさん
08/05/05 16:29:04
>>338
行列の掛け算は3重のループになるのだぞ。行列を勉強しましょう。


341:デフォルトの名無しさん
08/05/05 16:30:14
for(n = 0; n < 3; n++){
for(m = 0; m < 3; m++){
for(i = 0; i < 3; i++) c[n][m] += a[n][i] * b[i][m];
}
}

こんな感じ?



342:側近中の側近 ◆0351148456
08/05/05 16:33:49
>>338
(っ´▽`)っ
x行n列の行列Aのi行j列成分をa(i, j)、
n行y列の行列Bのi行j列成分をb(i, j)、
ABのi行j列成分をab(i, j)と表示するとき、

ab(i, j) = Σ(k=1→n)a(i, k)b(k, j)

線形台数の教科書を見直せ☆

343:デフォルトの名無しさん
08/05/05 16:51:00
>>339->>342
初歩的なことなのにわざわざ教えてくださってありがとうございます。
感謝しています。
あとほんとに初心者的なことなんですが、>>339さんのプログラムで計算は出来ました。
しかし答えを表示させようと思ったら、なんか変な結果になりました。
以下プログラムと結果です。
(最初のほうは省略)
for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++){
      ab[i][j] = 0;
      for(k = 0; k < 3; k++){
        ab[i][j] += (a[i][k] * b[k][j]);
      printf("%d ",ab[i][j]);}
    }
  }
  return 0;
}
結果
0 1 5 0 4 14 0 7 23 0 4 14 9 25 50 18 46 86 0 7 23 18 46 86 36 85 149


344:デフォルトの名無しさん
08/05/05 16:52:39
>>342
ゆとり乙
数学3cのレベルです

345:344
08/05/05 16:54:36
>>342
ごめんなさいゆとりは俺でした
数学3cじゃねええええええええええ
あああああああああああああ何か勘違いしてたああああああああ

346:344
08/05/05 16:55:21
やべえ今までで一番恥ずかしい書き込みだ

347:デフォルトの名無しさん
08/05/05 16:55:51
最近Cを始めた者なんですが
CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ポインタを使うような関数を自分で作る必要がありますか?
何かサンプルなどもありましたらお教えください。

348:336
08/05/05 16:55:51
僕はちなみに本当のゆとりです。

349:デフォルトの名無しさん
08/05/05 16:56:55
落ち着け
寿司食うか?

350:344
08/05/05 16:58:16
大体3cとかあんまりやってねぇんだよ・・・
ケーリーはミルトンの公式ばっかり使って足し算引き算ぐらいだっけ?
行列式はなかったよな・・・あぁ・・・俺なにやってんだろう

351:デフォルトの名無しさん
08/05/05 16:58:59
>        ab[i][j] += (a[i][k] * b[k][j]);
>      printf("%d ",ab[i][j]);}

                   ~~~

中括弧の位置


352:側近中の側近 ◆0351148456
08/05/05 17:03:14
>>343
(っ´▽`)っ
printfを最も内側のループの外に出せ☆

#include <stdio.h>

int main(void)
{
  int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
  int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}};
  int ab[3][3];
  int i;
  int j;
  int k;
  for(i = 0; i < 3; i++){
    for(j = 0; j < 3; j++){
      ab[i][j] = 0;
      for(k = 0; k < 3; k++){
        ab[i][j] += (a[i][k] * b[k][j]);
      }
      printf("%d\t", ab[i][j]);
    }
    printf("\n");
  }
  return 0;
}

353:344
08/05/05 17:05:08
ああああああああああああああああああああああ

354:344
08/05/05 17:06:41
ダメだ・・・

355:デフォルトの名無しさん
08/05/05 17:08:02
五月蝿い
トイレでも篭ってろ

356:344
08/05/05 17:08:42
線形台数の教科書読んできますノシ

357:デフォルトの名無しさん
08/05/05 17:10:23
>>347
>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ない
>ポインタを使うような関数を自分で作る必要がありますか?
ある

文字列操作の概念自体が違うので、CでVBのようなことをやるという考え自体を捨てること
まずCのやりかたというものを覚えるのが先

358:側近中の側近 ◆0351148456
08/05/05 17:12:08
>>347
(っ´▽`)っ
b = LEFT(a, n)

strncpy(b, a, n);
b[n] = '\0';

b = MID(a, m, n)

strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0'
で。

359:側近中の側近 ◆0351148456
08/05/05 17:13:30
(っ´▽`)っ
最後セミコロンが抜けたが気にしない☆

360:デフォルトの名無しさん
08/05/05 17:14:05
>>347
>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
どちらもsprintf()で代用可能。

361:336
08/05/05 17:14:14
>>351->>352
おかげさまでうまく答えも出ました。本当にありがとうございます。


362:344
08/05/05 17:14:54
>>361
俺と一緒に勉強しようぜ

363:347
08/05/05 17:17:36
>>357-360
ご回答ありがとうございました。
サンプルを参考にしながらC勉強をしていきます。

364:側近中の側近 ◆0351148456
08/05/05 17:23:39
(っ´▽`)っ
正確には
(っ´▽`)っ
b = LEFTB(a, n)

strncpy(b, a, n);
b[n] = '\0';

b = MIDB(a, m, n)

strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0';
だ。

strncpyの第3引数はバイト数。
LEFTとMIDを使いたければwcsncpyを使えばいいような気がする。

365:336
08/05/05 17:35:16
>>362
共にがんばりましょう。

366:デフォルトの名無しさん
08/05/05 17:44:26
 unsigned __int32 hentai, doutei;
 hentai = 293317826;
 doutei = 899523;

仮に上のように hentai と doutei に格納された数値において、
hentai += doutei;  // 293000000 + 899253
のように hentai の下6桁を0にして doutei を加算し、下6桁を doutei にしたい。

条件は
if ( hentai > doutei &&
  doutei >= 0 &&
  doutei < 1000000)

で、思いついたのが
hentai = ((hentai / 1000000) * 1000000) + doutei;

納得がいかないのでスマートなやり方教えてくれ。

367:デフォルトの名無しさん
08/05/05 17:50:49
>>366
十分スマートと思うが、どういう点で納得がいかないんだ。

hentai += doutei - hentai % 1000000;

368:デフォルトの名無しさん
08/05/05 17:58:57
>>367
おお、サンクス。
除算か乗算どちらかを一回でも削りたかったんだ。

369:デフォルトの名無しさん
08/05/05 21:57:45
>>363
Basic系から来た人だと right とかも使うんでしょw・・それは置いといて無いものは自作するってのも楽しみじゃないかいな?

>>360
参考までに書いてくれると周りも参考になるとおもう。
せいぜい数行だと思うから sprintf で書いてみてよ。


370:デフォルトの名無しさん
08/05/05 22:12:13
>>369
360じゃないが、こうじゃないかな。
char* left(char *dst, const char *src, int count)
{
sprintf(dst, "%.*s", count, src);
return dst;
}
char* mid(char *dst, const char *src, int pos, int count)
{
return left(dst, src+pos, count);
}


371:デフォルトの名無しさん
08/05/05 23:40:11
C言語用でお勧めのフリーコンパイラを教えてください

372:デフォルトの名無しさん
08/05/05 23:43:44
>>370
おお、%.*s ・・・しらなんだ。

373:デフォルトの名無しさん
08/05/05 23:47:34
>>371
・ GCC (MinGW)
・ Microsoft Visual C++ Express Edition 2008
好きなの選べ

374:デフォルトの名無しさん
08/05/06 00:05:01
>>373
その2つの違いがまったくわかりません…
それとMSの方はC++となってますがC言語にも対応してるんですか??

375:デフォルトの名無しさん
08/05/06 00:08:44
おまえは紹介されたコンパイラについてちゃんと調べたのか?

376:デフォルトの名無しさん
08/05/06 00:09:31
>>374
MSのコンパイラでもCのコンパイルはできます。但し、99年の規格にさえ準拠していないので注意が必要です。
gccは、Cコンパイラではなくコンパイラコレクションです。勿論、CもC++もコンパイルできます。
まぁ、MinGWにしろCygwinにしろ、環境に対する知識が必要にはなります。

377:デフォルトの名無しさん
08/05/06 00:24:49
fputc( )の使い方の説明で

int fputc(int 文字、FILE *ストリーム);

fputc( )関数は、「文字」の下位バイトを、「ストリーム」に結び付けられているファイルにunsigned char型の値として書き込みます。

とあるんですが、上位バイトはどうなるんですか?

378:デフォルトの名無しさん
08/05/06 00:25:59
捨てられる

379:デフォルトの名無しさん
08/05/06 00:26:49
URLリンク(www.bohyoh.com)

380:デフォルトの名無しさん
08/05/06 08:01:36
vistaで動くコンパイラだったら何がいい?
やっぱりbcc、gcc辺りかな

381:デフォルトの名無しさん
08/05/06 09:42:29
VC++ 2008 Express Edition

382:デフォルトの名無しさん
08/05/06 09:53:56
uint16 とか uint8 とかは int とどう違うのですか?

使い方を教えてください。

383:デフォルトの名無しさん
08/05/06 09:54:04
Express Editionとgccの好きな方

384:デフォルトの名無しさん
08/05/06 09:56:25
uint16_t や uint8_t なら標準(C99)で用意されているが
uint16 や uint8 は標準では用意されていない。

385:382
08/05/06 09:59:52
>>384
もう少し詳しくお願いします。

386:デフォルトの名無しさん
08/05/06 10:11:53
>>385
標準で用意されてない以上、
ヘッダファイル内にある定義を見てくださいとしか言いようが無い。

387:382
08/05/06 10:22:11
>>386
ということは・・・

uint16 uint8 はwindows.hとかでも定義されてる分ではなく、

自分の使っているライブラリかなにかで定義されているということですね。

わかりました。 調べてみます。

388:デフォルトの名無しさん
08/05/06 10:24:30
>>387
windows.hにあるかもしれませんが、そこにあったとしても標準とは言えません。
そもそも、あなたがWindowsを使っているのかどうか誰にもわかりませんから。

389:デフォルトの名無しさん
08/05/06 10:25:09
処理系独自に定義されてるかもしれないが、
どの処理系使ってるかも知らんし、
結局自分で調べてくれ、というこった。

390:デフォルトの名無しさん
08/05/06 13:51:05
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram hist);

int main (void){
struct histgram hist;
int z;
hist.x = 0;
for(z=0;z<100;z++){
hist.y[z]=0;
}
printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
one(hist);
printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
for(z=0;z<9999999999;z++);
return 0;
}

void one(hist){
two(hist);

void two(hist){
int z;
hist.x = 1;
for(z=0;z<100;z++)hist.y[z]=1;
}
とするとtwo(hist)でエラーが起きます。なぜでしょうか?

391:デフォルトの名無しさん
08/05/06 13:57:38
すいません、解決しました。

392:デフォルトの名無しさん
08/05/06 14:00:16
INT_MAX 4bites = 2147483647 < 9999999999

393:デフォルトの名無しさん
08/05/06 14:02:26
やっぱうまくいきません。
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram hist);

int main (void){
struct histgram hist;
int z;
hist.x = 0;
for(z=0;z<100;z++){
hist.y[z]=0;
}
printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
two(hist);
printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
for(z=0;z<9999999999;z++);
return 0;
}
void two(struct histgram *hist)
{
int z;
hist->x = 1;
for(z=0;z<100;z++){
hist->y[z]=1;
}
}
は何がいけないのでしょうか?

394:デフォルトの名無しさん
08/05/06 14:04:25
two()は構造体のポインタを受け取る関数
main()で呼んでるtwo()に渡されてるhistは構造体そのもの

あと>392

395:デフォルトの名無しさん
08/05/06 14:06:22
bites …くそorz

396:デフォルトの名無しさん
08/05/06 14:11:21
Winでコマンドプロンプトがすぐ終了するのを抑止したいなら、scanf("%*s"); がいい

397:393
08/05/06 14:11:59
URLリンク(www9.plala.or.jp)
ここに、393のようにかけと書いてありました…

393を書き直した正解はどうなるのでしょうか?

グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
処理された任意の変数をn個、n-1個上の階層で使用したいのですが


398:393
08/05/06 14:12:39
>396
ありがとうございます。使ってみます。

399:デフォルトの名無しさん
08/05/06 14:17:24
#define ZETTAI(x) (x < 0) ? -(x) : x

int x;

x = ZETTAI(-9 - 50) + 5;

これでxの中身が59になってしまうのですが、何故でしょうか?
-59をZETTAIで59にした後、5を加算しているはずなのですが

400:デフォルトの名無しさん
08/05/06 14:17:47
>>.397
そこの二つ目のの「seito2」は構造体の配列名。配列名は大抵の場合すぐポインタに成り下がるので、
ポインタを引数としてとるseidesp2()にそのまま渡すことができる。
>>393 の場合histは構造体の単体だから、two(&hist) として呼び出さなければならない。

>グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
>処理された任意の変数をn個、n-1個上の階層で使用したいのですが
言ってる意味がよくわからないが、1つの構造体のデータを再帰的に処理したいのなら構造体のポインタを渡す。

401:デフォルトの名無しさん
08/05/06 14:21:07
コンパイラのエラーメッセージをちゃんと読め。
プロトタイプ宣言と定義が噛み合っていないぞ。
void two(struct histgram hist);
void two(struct histgram *hist)...


402:デフォルトの名無しさん
08/05/06 14:23:09
>>399

x = ZETTAI(-9 - 50) + 5; 

↑は↓のように展開されるから。

x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;

これはもちろん

x = (-59 < 0) ? 59 : -54;

と解釈されて、xには59が代入される。

マクロZETTAIの正しい宣言は下のようになる。

#define ZETTAI(x) ((x < 0) ? -(x) : x)

もちろん自作などせずにライブラリ関数を使うことが望ましい。

403:デフォルトの名無しさん
08/05/06 14:23:31
>>399
#define ZETTAI(x) (x < 0) ? -(x) : x

#define ZETTAI(x) (((x) < 0) ? -(x) : (x))
にしておてきなさい。


404:デフォルトの名無しさん
08/05/06 14:30:39
>>402-403
上手くいきました
ありがとうございます

ですが、
>x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;
同じxなのに何故一番右のxだけに+5がくっつくのですか?

405:393
08/05/06 14:30:43
すいません、結構理解に手こずってます。
配列でなく、実体を受け渡しする場合は、
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram *hist);
int main (void){
struct histgram hist;
int z;
hist.x = 0;
printf("before***%d***%d***%d***",hist.x);
one(&hist);
printf("before***%s***%s***%s***",hist.x,hist.y[0],hist.y[50]);
return 0;
}
void one(struct histgram hist){
two(&hist);
}
void two(struct histgram *hist){
int z;
hist->x = 1;
}

だと思ったのですが、error C2440: '関数' : 'histgram *__w64 ' から 'histgram' に変換できません。
というエラーが出てしまいました。

406:デフォルトの名無しさん
08/05/06 14:36:01
>>404
元のx=の式の一番右の+5がそのまま残っているだけ。

407:デフォルトの名無しさん
08/05/06 14:36:58
>>405
構造体をそのまま渡したいのであれば、アンパサンドをつけてはいけません。

408:デフォルトの名無しさん
08/05/06 14:40:42
>>406
つまり
#define ZETTAI(x) (x < 0) ? -(x) : x を
#define ZETTAI(x) ((x < 0) ? -(x) : x) に変えると

x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; が
x = ((-9 - 50 < 0) ? -(-9 - 50) : -9 - 50) + 5; になるということですね?

#define ZETTAI(x) (((x) < 0) ? -(x) : (x)) だと
x = (((-9 - 50) < 0) ? -(-9 - 50) : (-9 - 50)) + 5; ですね!

理解できました
丁寧にありがとうございました

409:デフォルトの名無しさん
08/05/06 14:40:56
まぁ、あんなサイトを見ているようじゃいつまでたっても理解できないわな。

410:デフォルトの名無しさん
08/05/06 16:29:22
いいから黙ってstdlib.h::abs()を使え

411:デフォルトの名無しさん
08/05/06 16:49:43
やっぱ自作するより、ライブラリ探したほうがいいのかな

412:デフォルトの名無しさん
08/05/06 16:56:26
absはintだから・・・

413:デフォルトの名無しさん
08/05/06 16:56:59
そりゃそうだが基本的なパーツの使い方を勉強してる初心者にそれは野暮な突込みだ。

414:デフォルトの名無しさん
08/05/06 22:00:03
>>399
悪いことはいわん。inline 使え。
#define は C言語ではない・・マクロは副作用があるからうっかり a++ なんて記述したら・・判るでしょ?


415:デフォルトの名無しさん
08/05/06 22:03:58
inline は C99 からだから

416:デフォルトの名無しさん
08/05/06 22:56:05
>>415

そ、そんなこといいだしたら・・・今から始めるなら新しいツール使おうよって Linux も *BSD も Darwin も普通にクリアしてるし。Windows は今一つ判らないけどまさかそうじゃないの?


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

5372日前に更新/213 KB
担当:undef