C言語なら俺に開け! Part 〈54〉

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限Googleで検索を。

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

コンパイラを探しているなら >>2-13 を。

上記を逸した場合の結果は激しく未定義だゴルァ!!

  ∧_∧
 ( ´∀`)< ぬるぽ

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
>>1
使えない上司・先輩
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>1
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>1

  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>1
【過去ログ】
53 http://pc2.2ch.net/test/read.cgi/tech/1048995232/
52 http://pc2.2ch.net/test/read.cgi/tech/1047275669/
51 http://pc2.2ch.net/test/read.cgi/tech/1046104909/
50 http://pc2.2ch.net/tech/kako/1044/10449/1044938752.html
49 http://pc2.2ch.net/test/read.cgi/tech/1042646178/
48 http://pc3.2ch.net/tech/kako/1041/10411/1041127646.html
47 http://pc3.2ch.net/tech/kako/1040/10400/1040048202.html
46 http://pc3.2ch.net/tech/kako/1039/10393/1039328710.html
45 http://pc3.2ch.net/tech/kako/1038/10384/1038405432.html
44 http://pc3.2ch.net/tech/kako/1037/10377/1037796472.html
43 http://pc3.2ch.net/tech/kako/1037/10372/1037281411.html
43 http://pc3.2ch.net/tech/kako/1037/10371/1037134356.html
42 http://pc3.2ch.net/tech/kako/1037/10371/1037101156.html
41 http://pc3.2ch.net/tech/kako/1036/10368/1036876790.html
40 http://pc3.2ch.net/tech/kako/1036/10366/1036673739.html
39 http://pc3.2ch.net/tech/kako/1036/10364/1036409391.html
38 http://pc3.2ch.net/tech/kako/1035/10357/1035729526.html
37 http://pc3.2ch.net/tech/kako/1035/10356/1035623265.html
36 http://pc3.2ch.net/tech/kako/1035/10352/1035211039.html
35 http://pc3.2ch.net/tech/kako/1034/10343/1034337064.html
34 http://pc3.2ch.net/tech/kako/1033/10332/1033240509.html
33 http://pc3.2ch.net/tech/kako/1032/10326/1032606064.html
32 http://pc3.2ch.net/tech/kako/1031/10319/1031905402.html
31 http://pc3.2ch.net/tech/kako/1030/10307/1030786546.html
30 http://pc3.2ch.net/tech/kako/1030/10307/1030786546.html
29 http://pc3.2ch.net/tech/kako/1029/10296/1029605182.html
28 http://pc3.2ch.net/tech/kako/1028/10284/1028495798.html
27 http://pc3.2ch.net/tech/kako/1027/10271/1027160374.html
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/

【ぬるぽ】
  ∧_∧
 ( ´∀`)< ぬるぽ

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html

このゴミが!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>1
スレタイにぬるぽが入ってないだけでもマシか。
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>3>>4>>5>>9>>1の11,12行目
12デフォルトの名無しさん:03/04/11 01:40
すいません、誰かこのプログラム教えてください。
初心者には再帰が難しくて。

typedef struct CELL *LIST;
struct CELL {
int element;
LIST next;
};

リスト型を引数とする、
リストのセルがelementとして整数1500を
含んでいるなら1を返し
含んでいないなら0を返す再帰的関数です。
どうかお願いします
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>1
リンクくらい晴れ!
>>12
int contain_1500(const List l)
{
if (l->element == 1500) return 1;
return contain_1500(l->next);
}
int foo(const LIST lst)
{
 if (! lst) { return 0; }
 if (lst->element == 1500) { return 1; }
 return foo(lst->next);
}
>>14
まずった。
if (!l) return 0;
を先頭に追加してくれ。
17デフォルトの名無しさん:03/04/11 02:08
          __,,,,,,___
        (⌒ヽ:::::::::::'''''-,,
      <´・\  ::::::::::::::::::ヽ
       l 3 ハ::::::::::::::::::::::.ヽ,
   ∫  .<、・_ (         )
   旦 (⌒ ̄  ̄ ̄ ̄ ̄ ̄ ̄⌒) これで何したらいいんだろう・・・
    ____
    |\  \  \
    |  | ̄VC  ̄|
    |  |academic|
   \.|____|
自動変数はスタックに配置されるというのはCの規格で決まっているわけではないですよね。
必ずしもスタックがあるとは限らんし。
ただし、再帰を考えるとスタック的な何かは必須。
20デフォルトの名無しさん:03/04/11 03:16
音声処理プログラムでマイクに向かってしゃべって
「検索せよ」、「閉じる」、「開く」等の10−20程度の単語を
認識させたいと思っています。
音声処理を一からやっていたらさすがにムリなので、
そのようなAPIかなにか公開されてないものかと思って探しています。
もちろん有料のものでかまわないのでご存知の方いたらお教えください。
>>20
Microsoft Voice なんとか
>>19
そういう機能を提供するものを一般的にスタックと呼ぶんじゃなかろうか。
連続してようが双方向リストで提供されてようが。
>>19
ヒープでスタック実装できるじゃん。
     __________
  /o [地獄逝き特別急行] o\
  |┃──────────┃|/
  |┃             ∧_∧ ┃|  ぬるぽ ぉぉぉぉぉぉぉぉん!
  |┃           (´∀` ) ┃| \
  |┃__________┃|
  |┃__________┃|
  | \___________________/ |
  |========================|
  |========================|
   |ヽ[■]___________[■]/|
    |_三三三三三三三三三三_|
   |     | [=.=] |     |
   \ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄/
      ̄ ̄        ̄ ̄
      /        \
   Delphi.NET、安値でゲットォーーー!!
    ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄(´´
        ∧∧   )      (´⌒(´
   匚⊂ミ゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
  /        ̄ ̄  (´⌒(´⌒;;
/                    \


                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< ぬるぽぬるぽ!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< ぬるぽぬるぽぬるぽ!
ぬるぽ〜〜〜〜!   >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」
               ̄     / /
27デフォルトの名無しさん:03/04/11 11:22
struct { enum { A , B } e : 1; } x;
x.e = B;
assert( x.e == B );

今の仕事で使っている、とある古めのコンパイラで
このassertが失敗してびびったのですが、
規格で許された動作なのでしょうか?
>>27
俺は符号拡張とかなんとかが面倒なので、ビットフィールドは
unsignedでしか使わないことにしてる。
メモリのない環境もあるし。
>>27-28
ただのunsignedだとsignedとの比較で悲惨なことになるから
unsigned shortあたりにしといたほうがいいんじゃないか?
>>30
ビットフィールドには int/signed int/unsigned int しか指定できない。
>>31
マジかよ。
俺が何気なく使ってたこの機能はVCの勝手な拡張だったのか・・・。
>>30
っていうか、unsigned とsignedで問題起こるのを
shortにしたからって、なにがどうなるの?
3427:03/04/11 11:57
>>27のassertが通ることを保証しているのはC++の規格でした。
Cだと、enumと互換性を持つ型がどれかで動作が決まるので、処理系依存ってことらしいです。
↓Googleでみつけたところ。
maths.newcastle.edu.au/~rking/R/devel/01a/0098.html

結論は、Cではenumにビットフィールド指定するな、ということで。
C++なら(コンパイラが規格に従う限り)大丈夫らしい。
>>32
なんでまたint以外を使うの?
>>33,35
unsigned intだと負数との比較のときとか厄介じゃん?

範囲チェックしたいときとかさ、

struct
{
 unsigned int value: 4;
} border;

int checked_value = 何か;

if ( border.value<=checked_value )
{
 checked_value unsigned int に格上げされるので、負のとき危険
}
3735:03/04/11 12:39
>>36
俺の言ったintにはunsigned intも含むんだけど。
なんでcharとかdoubleのような(unsigned)int以外を使うのかなと。
>>37
unsigned short us = 0;
unsigned int ui = 0;
int i = -1;
assert( us > i );
assert( ui < i );
そもそもunsignedとsignedを比較するほうがどうかしていると思うのだが。
>>36
で、unsigned int を unsigned short にしたからって、なにがどうなるの?
4135:03/04/11 13:15
>>38
ビットフィールド使っていないじゃん!
>>40
正しく計算できる
unsigned int と signed int -> unsigned int に格上げ = 符合が失われる
unsigned short と signed int -> signed int に格上げ = だいたいshort>int(環境依存だけど)だから何も失われない

>>41
MSコンパイラの拡張機能なのでどうでもいいことだけど、ビットフィールドでも同様のことが起こるのよ。
4342:03/04/11 13:33
ごふ
short<int
>>42
そんなことを気にするなら、ビットフィールドに限らずunsignedを
使うときには常にshortにしろって話になると思うが。
そもそも1ビットのビットフィールドでsignedを使うのが阿呆。
そもそもunsigned int signed intを直接比較するのが阿呆。
46デフォルトの名無しさん:03/04/11 20:09
たまにプログラムで Build# のようにビルドした回数を表示してるものがありますが、
ああいう事はどうやれば出来るんでしょうか。
VC++を使っています。
47前スレ 983:03/04/11 20:19
ここがあったのに・・・

いろいろ試したつもりですが
精度的な問題がつかめませんでした。
結果は同じ、速度は掛け算の方が7倍(以上)?のような気がします。
もしかしてつかえる?
と思ったのですがやっぱり問題がありそうな気がして恐いです。

ガウスの消去法による、逆行列の計算が
早くなるかと思って期待をしているわけなのですが。
48デフォルトの名無しさん:03/04/11 20:20
本を読んでて疑問に思ったことがあったので質問です。
typedef struct stack{
int data[1];
int top;
int size;
}stack_t;
と言うスタック構造体があって、データをポップする関数があります。
そこで関数の最後に
return stack->data[--stack->top];
という記述があるのですが、これはトップのデータをリターンして、
トップを1つ下げるという意味なのでしょうか?
それともトップを1つ下げたところにあるデータをリターンするという意味なのでしょうか?
確か、記号の優先順位は--よりも[]の方が上だったような気がするのですが、やはり前者でしょうか?
ご教授お願いします。
return stack->data[--stack->top];

--stack->top;
return stack->data[stack->top];

data = stack->data[stack->top];
--stack->top;
return data;
この3パターンを試してみたら?
>>48
この場合--と[]の優先順位は関係ないよ。
>> 46
これでいいか? でなければ、他のやりかたで何とか汁
実行するとリソース(FileVersion)を書き換えてビルドするマクロ

ttp://www.codeguru.com/devstudio_macros/build_number.shtml

5248:03/04/11 22:38
>>49,50
ご返信ありがとうございます。
後者の方だと考えると物理的にポップが変になってしまう気がするんですが。
とにかく自分で色々と試してみますね。
>>51
それでいいです。ありがとうございました。
よく見るとヒラケだし
55デフォルトの名無しさん:03/04/12 07:18
良スレ上げ
>>48
前置デクリメント
キーワード:後置、インクリメント
57:03/04/12 09:29
win32apiでCopyFile、DeleteFile使い
ファイルを移動させると
やたらがりがり音がするので
Cで移動させたいのです。どうすればよいですか?
>>57
標準ライブラリは結局CopyFileやDeleteFile読んでるから、
標準ライブラリを使わないで作ることになるね。
ドライバ用命令つかったりハードウェアを直接操作したり。
うん。あんたには無理だ。
59デフォルトの名無しさん:03/04/12 09:38
  ∧_∧
 ( ´∀`)< ぬるぽ
60:03/04/12 09:39
>>58
ありがとう。同じ事なら止めときます。
構造体のメンバに
char *
を用意して(他にもbool int floatもある)

構造体自体を
mallocで任意の配列として確保します。
で、その後にメンバの
char *
を使って、任意の文字列をmallocしたいのです。
文字列の確保、格納、使用までは上手く行ってますし
アドレスをデバッグにかけてみても、メモリが壊れてる気配も有りません。
…しかし、freeする段階で(ちゃんと、確保した順と逆に開放してます。)
エラーが出ます。
DAMAGE debug heap.cだったと思います。
ヒープ領域で何かが起っているのでしょうか?
直し方の見当も付きません。
>>61
おそらく書いたコードに間違いがあります。
移動してからfreeしている?
>>57
MoveFile()
とりあえず解放してるとこのコードをコピペしる
66デフォルトの名無しさん:03/04/12 12:58
free(malloc(12345);
67デフォルトの名無しさん:03/04/12 12:58
free(malloc(12345));
68デフォルトの名無しさん:03/04/12 13:05
typedefvoid(*FUNC)( . . .);
として、
FUNC FuncTbl[]={ hoge1,hoge2,hoge3, };
と関数テーブルをつくり、
hoge1() などは戻り値を返す関数であるとした場合、
long retval=FuncTbl[0]( );
のような事は出来ないのでしょうか。

要約すると、関数テーブルの関数を実行して戻り値を得ることが出来ますか、
ということなんですが・・・。

戻り値なしの関数を指すポインタなんだから、戻り値を返す関数(のアドレス)は代入できないし、それを呼んで戻り値を得ることもできないでしょ。
・・・・・・・多分。
typedef long (*FUNC)(.);
>>68
typedef long (*FUNC)(...); ならできる。
longは最低でも128bitにしてほしかった。
7368:03/04/12 13:37
みなさまレスどうもです。
そのまんまでしたね。
ありがとうございました。
>>68,71
一応、ellipsisだけでプロトタイプとして有効なのはC++。と突っ込んでおく。
シネヤ!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>59
>>70-71ケコーン
77デフォルトの名無しさん:03/04/12 14:36
memsetは危険だから使うなと聞いたのですが。
memset()が危なくて使えないようならCは使うな。
PerlとかVBでも使え。
79デフォルトの名無しさん:03/04/12 14:45
>>78
そうします(T_T)
80デフォルトの名無しさん:03/04/12 14:46
誰から?
81デフォルトの名無しさん:03/04/12 14:49
標準関数の中で絶対に使ってはならないのはgetsだけ?
(σ・∀・)σ ゲッツ!
83デフォルトの名無しさん:03/04/12 15:17
プッツ!
>>81
strcpyとかもさけるべき
strncpyを使う
>>84
strcpy使いまくってますが何か?
>>84
また話を蒸し返すのか?
strlcpy か astring を使おう。
strncpyは '\0' を付加しない仕様を知っていれば
危険じゃないだろう。
先頭に'\0'を入れてstrncat
ここは酷い釣堀ですね
基本的な質問なんですが、
今更C言語なんて何がいいんですか?
言葉遊び
保守
>>91  はぁ? 何言語と比べて?
プログラミング言語は色々あるからさぁ、
そんな質問じゃあどうしようもない。
ジエンウザ
95 デフォルトの名無しさん:03/04/12 15:47
ジエンウザ
97デフォルトの名無しさん:03/04/12 21:06
>>47
普通は問題になるとは思いません。

1/b がレジスタに確保されれば、丸め誤差すら存在しないと思います。
少なくとも Intel 系 CPU の内部では 80 bits の精度で計算してますから。
C言語のおかげで毎月80万円の給料をもらっている。
明日からC言語が消滅したら・・・JavaかC++でも使うかな(でも給料は半減だ)
使いこなせない言語だと仕事こなせなくて給料下がるよね。
100ゲッツ!!!!
101デフォルトの名無しさん:03/04/13 00:18
⊂⌒~⊃。Д。)⊃[NULL]
ヌルポゲッツ!!!!
   ( ・∀・)   | | ガッ 
  と    )    | |
    Y /ノ    人
     / )    <  >_∧∩
   _/し' //. V`Д´)/ ← >>101
  (_フ彡        /
n*n行列の計算をしようと思って
scanf("%d",&n);
int A[n][n],B[n][n],C[n][n];
としたら
エラー E2313 arb.cpp 10: 定数式が必要(関数 main() )
と出てきてしまいました
予め大きな数(10)を取っておいて
int A[10][10],B[10][10],C[10][10];
とするしかないのでしょうか?
>>103
"malloc 二次元配列" ぐらいでググれ。
>>103
10x10 程度なら、そうするのがいいでしょうね。
106103:03/04/13 14:46
ありがとうございます
ここで質問する人ってのは、
自分で調べることも出来ない無能なんですか?
>>107
50% ぐらいはそう。
10% ぐらいは調べてもわからないから質問してる奴。
残り、40% はお前や俺みたいに C言語に関係ないことを書いてるアフォ。
109結果の違う理由は?:03/04/13 17:29
#include <stdio.h>

void main( )
{
char a;
unsigned char b;

a = 0xFF;
b = 0xFF;

printf( "a = %X\n", a );
printf( "b = %X\n", b );
}
char aがsigned charとして扱われているから。
unsigned charとして扱われる処理系なら結果は等しい。
111デフォルトの名無しさん:03/04/13 17:34
>>108
ぬるぽとかぬるぽ叩きとかな。
printf インテグラルプロモーション 符号拡張 ゼロ拡張
113107:03/04/13 17:37
>>108
つまりその10%の人たちは調べても分からない無能なんですね。
>>113
つまり、質問者が無能かどうか、調べても分からない>>107は無能なんですね?
>>113
そういう意味では、無能だよ。
それがどうかしたのか ?
無能だっていいじゃない!
この子が元気ならそれでいいじゃない!
140 デフォルトの名無しさん:03/04/13 15:37
本のタイトルに「C言語」と入っている本はよくない、みたいなレスを見かけるんですが、
どうしてよくないんでしょうか?

スレ立てるまでもない質問でこんあのあったよ。 
誰か答えれる?
>>117
日本語だから。
ワラタ 
>>117
C言語は糞だからその解説本も糞だらけ
つまり良本なんて無いってこった

C言語と入ってない本の著者が遠まわしに宣伝してるだけかもしれんが
121デフォルトの名無しさん:03/04/13 20:43
初心者です。

#include<stdio.h>
#include<math.h>


main()
{

double th,s;

th=1.57;
s=sin(th);
printf("%f\n",s);
}


でコンパイルすると

/tmp/ccSjmpTh.o: In function 'main':
/tmp/ccSjmpTh.o(.text+0x3d):undefined reference to 'sin'
collect2: ld returned 1 exit status

と表示されてしまいコンパイルできません。
どうすればよろしいでしょうか?
>>121
-lm
123121:03/04/13 20:52
>>122

ありがとうございます。できました。
-lmについて調べてみます。
124デフォルトの名無しさん:03/04/13 21:00
初心者です。

グラフィックライブラリを使用する際の
#include<???.h> この???には何を入れればよいでしょうか?

それとコンパイル時の -??  この??には何を入れればよいでしょうか?
scanfって一般的になんて読まれてるんですか?
126デフォルトの名無しさん:03/04/13 21:09
>>125
スキャンファンクション
>>125
すきゃんえふ
>125
スケァネフ
129デフォルトの名無しさん:03/04/13 22:58
BMPの表示プログラムソースをヘッターまで読み出せるのですが
イメージデータがうまく読み出せません。
それはおきのどくに。
がんばれ。
初心者にはPascalを勧めようよ。
その方がいいよきっと。
昔はミリバールだったな。
おまえら優しいな
135デフォルトの名無しさん:03/04/13 23:20
strncpyの使い方を教えてください。
>>129
もう少し情報がないと答えられない。
それと、これはC言語の問題なの?
>>120
10点。

>>120がC言語は糞と思う理由が述べられてない。
何言語より糞なのかも不明
最終行・・・さらに意味不明。
135 デフォルトの名無しさん:03/04/13 23:20
strncpyの使い方を教えてください。
(*(int (*)(char*,char*))strncpy)(s,s2);
>>135
「strncpyの使い方を教えてください。」と発言するときに使う。
Palmの辞書ソフト「KDIC」用に辞書ファイルのファイルサイズを減らそうとしているのですが
困ったことに。
コンバート元のフォーマットは

hoge /// piyo
hoge2 /// piyo2

のように見出し語とデータが「 /// 」で区切られている形になっています。で、
「hoge」の部分が11文字以上ならその行は削除するという方針で以下のように組んでみま
した。
が、これを走らせると出力サイズが8MBを超えたあたりで「"read"になることは
できませんでした」のエラーが出てしまいます。ちなみに変換元のテキストデータは20MB強。
fgetsなんかは、扱えるファイルサイズの上限なんかがあるんでしょうか?

int main()
{
FILE *rfp, *wfp;
char buf[4089];

wfp = fopen("d:\\convert.txt", "w");
if (rfp = fopen("D:\\eijirou\\waeiji.txt", "r")) {
while (fgets(buf, 4089, fp)) {
if ((strstr(buf, " /// ") - buf) <= 10) {
fprintf(wfp, buf);
}
}
}
fclose(rfp);
fclose(wfp);
}

142デフォルトの名無しさん:03/04/14 03:59
>>141
 fprintf(wfp, buf);

 fprintf(wfp, "%s", buf);

 fputs(buf, wfp);
にするべし。
% を含む文字列があった場合に変になる。
多分、それで変なメモリ領域を読み出そうとして
そういうエラーになったんだと思う。
つまり、"read" はファイルの読み出しじゃなくて、
メモリアクセスの方のなのでは。
>>142
Win2000とかで出るやつだな。直訳らしいが酷い訳だよなぁ。

>>141
>>142の言うように、printf系関数のフォーマット文字列には定数を与えるのが鉄則。
144143:03/04/14 08:10
> if ((strstr(buf, " /// ") - buf) <= 10) {

strstrの戻り値を確認していないのが気になる。
" ///"がなかった場合NULLが返るけど、NULLからあるポインタを引いた答えって決まっているのかな?
Win2000+VC++6.0の組み合わせでは上の条件式は" ///"が見つからなかった場合、真になるね。
145143:03/04/14 08:11
真になっても構わないのならいいんだけど(^_^;)
>>141
while (fgets(buf, 4089, fp)) {

この部分は、
while (fgets(buf, 4089, rfp)) {
だな。
>>141
1行は4089で足りる? オーバーする行があったらどうなるか考えた?

#sedでもawkでも、perlでもできるような気がするんだけど...
>>141
つっこみどころ満載だなー!
#include <stdio.h>

void main( )
{
signed char a;
unsigned char b;

a = 0xFF;
b = 0xFF;

printf( "a = %X\n", a );
printf( "b = %X\n", b );
}

結果
a = FFFFFFFF
b = FF

どうして結果が違いますか?
>>149
ネタ?
-1と255を代入してそれをprintf()でintに変換して表示してるからだよ。
>>149
charをshort にしたら同じになるよ(w
152デフォルトの名無しさん:03/04/14 17:24
long型の変数に入っている数値を
文字列に変換したいのですが、
何か簡単にできる方法はありませんか?

1桁づつアスキーコードに変換するという方法は思いつくのですが
よろしくお願いします
153デフォルトの名無しさん:03/04/14 17:46
>>152
sprintf
>>153
サンクス
155141:03/04/14 20:48
レスどうもでした。
>>142さんの方法で無事解決です。

総ツッコミ受けているように明らかに酷いソースなんですが、自分の環境下で一回満足に
動けばそれでいいというものなのでこんな感じに・・・。こういう場合でもちゃんと作るべき?
>>155=141
そういうときはawkでも使うのが無難。
cで書くにしても、普段からちゃんと書く癖をつけておけばバグが減ると言うものです。
157デフォルトの名無しさん:03/04/15 05:08
typedef struct CELL *LIST;
struct CELL {
int element;
LIST next;
};
これを用いて
整数のリストを引数とする
再帰的な選択ソートのプログラムを教えてくれませんか?
C/C++の宿題やらせてください。おながいします
http://pc2.2ch.net/test/read.cgi/tech/1045074808/l50
159157:03/04/15 05:31
すいません。書き込むとこ間違えました。
160デフォルトの名無しさん:03/04/15 16:10
代入が起るときは
代入先の変数の型に自動で変換される ってことは
イメージ的には代入元を代入先の型にキャストした値が
代入されると考えて良いでしょうか?
型格上げできる組合せは限られてるわけだが、許される組合せに関して言えば
それでいい。
162160:03/04/15 17:21
>>161 助言ありがとうございました。安心できました。
163デフォルトの名無しさん:03/04/15 22:56
計算方法がわかりません。

int value1 = 800000;
double value2 = 0.000000125;

として、

printf("result = %d\n", (int)((double)value1 * value2));

とすると、結果は1とならず0となります。
なぜ1にならないのでしょうか?
>>163
800000*0.000000125=0.1ですよ。。。
165デフォルトの名無しさん:03/04/15 23:01
>>164
あ、8000000でした。すみません。

関係ないけど、スレタイ「開け」になってるね。
>>165
知らなかったよ(TT)
167163:03/04/15 23:37
同じ計算を0.1×10と行って1桁ずつ増やしていったら
tmp1 = 0.000001;
tmp2 = 1000000;
の時点で結果が0になってしまった。
キャストの問題でしょうか?
浮動小数点演算がぴったり整数値になると思っちゃイヤン
>>167
gccだと最適化の程度によって答えが変わる罠。

冗談はさておき、小数の方が2の負のべき乗になっていないために
演算精度の関係で積が(1に極近い)1未満になっていると思われ。
最適化を強くすると事前に積を求めてしまうのでイミディエイトの1になってしまう。

というわけで、キャストのときは精度に注意しましょう。
>>168
そのごみのようなページは何?
172163:03/04/16 00:12
>>170
具体的にどうキャストすれば、int型で出力できるでしょうか?
>>163

>printf("result = %d\n", (int)((double)value1 * value2));

printf("result = %d\n", (int)((double)value1 * value2 + 1e-10));
とでもしてみたら?
174163:03/04/16 00:21
>>173
1e-10で帳尻が合うのでしょうが、なんか納得いかないです。
すみません。
一旦変数に入れるしか方法は無いかもしれないですね。
%gで1になった・・・
0.000001→double からすでに劣化してるしな・・
>>163
実数演算を厳密にやろうとしたら常に精度に注意を払わないといけなくなる。
例えば、0.1を10回足しても1にはならないという現象も出てくる。
10進数の小数を2進数で表現する以上、避けては通れない道だと思うしか。
>>175
%gだと高々6桁程度の精度で丸めるからな。
>>176
そだね。
逆に、2^(-12)は劣化しないけど。
179163:03/04/16 00:29
int main(void)
{
int value1 = 8000000;
double value2 = 0.000000125;
double result;

result = (double)value1 * value2;

printf("result = %d\n", (int)result);

}

結局こうしてみました。

>>175
int型で表現したかったので、すみません。。説明不足でした。
>>177
そうですね。今後気をつけます。

皆様ありがとうございました。
単にintにキャストじゃなくて、近い整数に丸めてからの方が安心。
rintかround。
そうそう。intにするときは「丸めない」からね。xx.yyy...という数のxxの
部分をintに入れるだけだよ。だから179のコードでも結果は同じだと思う。
>>179 で解決する理由がわかりません。
単に他の変数に放り込んだだけのように見えます。
本質的に >>163 とどう違うのか、誰か教えてください。
IntelCPU系だと、内部演算の精度がdouble以上あるから
一旦doubleの変数への丸めが入る段階で巧くいくこともある。
勿論、巧くいかないこともあるからεを足す工夫は必要。

round()を使ってもいいが、(int) (double値 + 1e-15)でも充分。
つか、>>163が"%d"で書こうとしていたところを見ると、この乗算結果が
数学的には整数になることが元々予測できてたんじゃないか?
技術系の計算ではたまにあるよね、そういうこと。
そういったシチュエーションだったら、1.e-10とか1.e-15とかいう半端な数を
突然持ち出すより、いっそ「四捨五入」という意味で、
  (int)(double値 + 0.5)
とする方がスッキリ納得してもらえるんじゃない?
質問。
#define fname "data.txt"
....
strcat(buf,fname"がないよ");*/strcpyでも良い/*
....

という第2引数書き方はC言語的にやって良いのでしょうか?
文字列の扱いはあまりよくわからないので・・・。
突込み所満載だな。

文字列は、"abc" "def"のように書くと"abcdef"と解釈される。
なので、
fname "がないよ"は問題なし。
しかし、
・define名は大文字にするのが一般的
・コメントの書き方が変
・一般的にstrcpy()でもstrcat()でもいいなんてことはないはず
・もしそうだとしたらどこかに無駄があるかもしれない
・そもそもsprintf()を使うほうが無難なケースなのかもしれない

とまぁ、このくらい書いておけば後で誰か突っ込んでくれるだろう。
> ・define名は大文字にするのが一般的
これだけ、他のつっこみとレベルがちとズレてるな
とチャチャ入れ
>>185

char sz[] = {"/*
#define fname "data.txt"
....
strcat(buf,fname"がないよ");*/strcpyでも良い/*
....
*/"};

こんな感じになってるなら問題ない。
189185:03/04/16 14:00
>186
thx! 謎が解けました。
コメントはこのスレ用に書いたものだったけど、どうもやり方間違えたようですな。
sprintfでも良かったんですけど、使ったことの無いやつを試してみたかったのです。(汗
ともあれ、ありがとうございました。
>>188
ありありだろ(w
おおありなごやはしろでもつ
伊勢は津でもつ津は伊勢でもつ
charの練習で以下の文をつくりますた
void change(char* a){
 a = "AAAAAAAAAAAAAAAAAA";
}
int main(){
 char *test1;
 test1 ="HelloWorld.";
 change(test1);
 printf("test1 : %s\n", test1);
 return 0;
}

test1の内容を"AAAAAAAAAAAAAAAAAA"
に変えようとしてるのですが"HelloWorld."
のままです。
なんででしょう?

>>193
void change(char** a){
 *a = "AAAAAAAAAAAAAAAAAA";
}
int main(){
 char *test1;
 test1 ="HelloWorld.";
 change(&test1);
 printf("test1 : %s\n", test1);
 return 0;
}
>>194
それだと動きました。どうもです。
でも、どうしてポインタが2つも必要なんでしょう?
>>195
ポインタ変数に書き込んでもらう必要があるから。

int 変数に書き込んでもらうには...

void change(int *x){
 *x = 123;
}

int main(){
 int a;
 a = 0;
 change(&a);
 ...
}

とするのと同じ。
今回は、たまたまポインタ変数だったから 間接演算子 '*' が2個並ぶ。
197C初心者:03/04/16 23:48
本当に超初心者的な質問で申し訳ないのですが、神の方教えて下さい。
appleを入力した数の分だけ表示させるというプログラムを作ろうと
思って下のようなソースを書いたのですが、実行すると
no newline at end of fileと出ます。何処がおかしいのでしょうか?
間違ってる箇所がどうしても見つからないので分る方ご教授下さい。
ちなみにコンパイラはgccでCygwinで実行してます。他のソースを実行する
際は問題は起きてません。

#include <stdio.h>
main()
{
int a , b ;
scanf("%d" , &a);
for( b = 0 ; b < a ; b++ )
printf("apple ");
}
>>197
最後に改行でもいれておあげ。
>>197
最後に改行を加える。
なんで最後に改行が無いとwarningになるの?
>>200
ハッカーは改行で終わっていないと気持ち悪くなるらしいです。
>>201
それだけの理由なの!?
203C初心者:03/04/17 00:06
198,199の方々の神に感謝。
きちんと実行できますた。
こんなくだらないことで2時間も延々と迷ってた自分が恥ずかしくなりました。
やっぱり基礎知識は重要ですね。本当今日が今までで一番2チャンが有効活用できますた。
204201:03/04/17 00:07
>>202
規格で改行で終わっていなければならないと決められているから。とこのスレか前スレで誰かが書き込んでいたけど、本当かどうかは知らない。
if(ferror(fin)) perror(NULL);
としたいのですが、ferror() によって errnoが書き換えられる事はないのでしょうか?
ない
>>204
ファイルの終了を想定しているのか?
>>203
別に改行いれなくても実行できるっしょ
C そのものはフリーフォーマットでも、プリプロセッサは行処理するから・・・とか?
ホワイトスペースの文字コード(isspaceが真を返す範囲)を得るにはどうしたらよいですか?
# setlocale 対応で
char ch[256];
for( i = 0; i<255; i++) ch[i] = isspace(i);
でとれる。
なんで255を除くの?
>>212
255は、どのロケールでもisspaceで真にならないから。


とボケてみる。
214デフォルトの名無しさん:03/04/17 04:56
夜分すいません。
WinXP,BCC32で、
--------------------
#include <stdio.h>
void main(void){
char str[15]="abcdefghijk";
int *p;
p=str;
putchar(*p);
putchar(*(p+1));
putchar(*(p+2));
putchar('\n');
}
--------------------
解説書ではabcと出力されるとあるのですが、aeiと出力されました。
変数を変えて+3,+4にしても1ずれるはずのものが4づつずれます。
4飛びになってしまうのはなぜなのでしょう?
215デフォルトの名無しさん:03/04/17 05:01
それは p が int* だからです。
char* p にすればよろし。
理由は自分で調べれ...
216デフォルトの名無しさん:03/04/17 05:03
>>215
手がかりThx.
お礼に何か差し上げたいところですが何も無いので跳躍します。
C言語ってなんですか?
どこかの国の言葉ですか?
エスペラントみたいな?
とりあえず名前すらも知らんやつはプログラマじゃないな
>>217
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 | 1点!!!!    |
 |_________|
    ∧∧ ||
    ( ゚д゚)||
    / づΦ
 \ (___ノ
220デフォルトの名無しさん:03/04/17 12:15
配列を使って縦50、横6で数字を0から並べたいのですがどうすればよろしいでしょうか?
221デフォルトの名無しさん:03/04/17 12:27
>>220
配列にタテヨコはないが、二次元配列を使えばいい。
222デフォルトの名無しさん:03/04/17 12:36
ありがとうございます、二次元配列を使って作っているのですが、どうも・・うまく動かないのです。
>>222
ソース晒しキボンヌ
224デフォルトの名無しさん:03/04/17 12:46
# define MAX_ROWS 6
# define MAX_COLS 50
#include <stdio.h>
int main()
{
int table [MAX_ROWS][MAX_COLS];
int x;
int y;
for (x= 0; x<MAX_ROWS; x++)
for (y= 0; y<MAX_COLS; y++)
{
printf("%d ", table[MAX_ROWS][MAX_COLS]);

}
fflush(stdin);
getchar();

}



超初心者ですみません。
>>224
#define MAX_ROWS 6
#define MAX_COLS 50
#include <stdio.h>
int main()
{
  int table [MAX_ROWS][MAX_COLS];
  int x, y;
  for (x= 0; x<MAX_ROWS; x++) {
    for (y= 0; y<MAX_COLS; y++) {
      printf("%d ", table[MAX_ROWS][MAX_COLS]);
    }
    printf("\n");
  }
  return 0;
}
table[MAX_ROWS][MAX_COLS]は
table[x][y]でしょ。
tableに代入してないよ?
二つのfor文が上下逆さじゃない?
>>223
#define MAX_ROWS 6
#define MAX_COLS 50
#include <stdio.h>

int main(){
int table [MAX_ROWS][MAX_COLS];
int a=0,x,y;

while(a<300){
for(y=0;y<MAX_COLS;y++){
for(x=0;x<MAX_ROWS;x++){
table[x][y]=a;
a++;
printf("%d ",table[x][y]);
}
printf("\n");
}
}
return 0;
}

汚いけど...
>>229
ありゃ?これで...

#define MAX_ROWS 6
#define MAX_COLS 50
#include <stdio.h>

int main(){
int table [MAX_ROWS][MAX_COLS];
int a=0,x,y;

while(a<300){
for(y=0;y<MAX_COLS;y++){
for(x=0;x<MAX_ROWS;x++){
table[x][y]=a;
a++;
printf("%d ",table[x][y]);
}
printf("\n");
}
}
return 0;
}
>>229,>>230
だめぽ...
232デフォルトの名無しさん:03/04/17 13:58
>>231
while{}は不要。
xとyの二重ループで300回じゃん。
皆さんありがとうございます。難しいですね、プログラミングって
234デフォルトの名無しさん:03/04/17 14:27
プログラミングは積み重ねだからね。

あ、こういう質問は宿題スレのほうがいいかも。
宿題じゃなくても。
>>232
そういえばそうですね
別に配列使わなくてもループだけでいいのでは。
237喧嘩王 ◆52.FsIEe7o :03/04/17 14:29
for(y=0;y<MAX_COLS;y++){
  for(x=0;x<MAX_ROWS;x++){
    table[x][y]=a++;
    printf("%d ",table[x][y]);
  }
  printf("\n");
}
プ━( ´,_ゝ`)━( ´,_ゝ)━( ´,_)━( ´,)━( )━m9( ゚,_ゝ゚)プッ!!
238デフォルトの名無しさん:03/04/17 14:35
>>236
配列使ったのは、たぶんあとで拡張するために。

>>237
%3d にするとケタがそろうよ。
%3dを使うとなぜ桁がそろうようになるのですか?
240山崎渉:03/04/17 15:09
(^^)
241デフォルトの名無しさん:03/04/17 16:24
>>239
へるぷ嫁
242デフォルトの名無しさん:03/04/17 17:49
アドレスからそのアドレスに割り当てられている変数名(文字列)が
取得したのですがどうすればいいですか?

int a;
int b;
int c;


printf("a=%d",a);
printf("b=%d",b);
printf("c=%d",c); ←こいつらをLOOPさせて1行にできないか?
printf("a=%d b=%d c=%d", a, b, c);
printf("c=%d ", c, printf("b=%d ", b,printf("a=%d ", a)));
245242:03/04/17 18:40
実際はa,b,cの3種類ではなくて
1万個ぐらいの変数(!=配列)があるんです。
1万行のprintfを書くかしかないのか・・・
設計を見直せ
環境依存で良ければ、int i, a=1, b=2, c=3, *p;
if(a<c)p=&a;
else p=&c;
for(i=0;i<3;i++)
printf("%d ", *(p+i));
>>247 それは何のジョークでつか?
1万もの変数って何の変数?
つうかマルチポストうざい
251デフォルトの名無しさん:03/04/17 19:30
1マンコぐらいの変数でがたがた言ってる奴って
大規模システムの開発とかやったことないんじゃねぇの?プッ
int i;
while((i = getchar()) != EOF)
printf("printf(\"%c=%%d\",%c)", i, i);

でコードの自動生成はどうだ?
sizeof(int) * 10000 = 40000byte = 40kbyte

ところで、そんなにたくさんの変数の命名規則はどんな感じ?
254デフォルトの名無しさん:03/04/17 19:47
>252
変数名手打ちするそれの、どこが自動生成なんだと小一時間...(ry
さっさと配列なり適切なものに直せ
256sage:03/04/17 20:06
>255
例えばお前はソースを追っていて配列の255番目に入ってる値の意味が何なのか
すぐにわかるか?いちいち調べる事になるだろ?
コーディングする時も大変な事になるぞ。
名前からその変数の持つ意味が直感でわかるような変数名が理想なわけ。

素人はすっこんでろ。
>>256
普通インデックスに名前付けるだろ
258sage:03/04/17 20:10
>>256
だからさっさと直感で分かるような変数名に直せっつってんだよ。

職業アマグラマは素人に戻れ。
>>256
適切な物も選択できないのか。
>>242
やりたいこととコードが合っていないと思うのは俺だけか?
261260:03/04/17 20:12
つーかCじゃ不可能だろ・・・・
コンパイル&リンクしたらもう変数名なんて無意味なものになるし。
情報を小出しにしないで、もっとちゃんと説明しる。

じゃなきゃ、答えられないって。
263260:03/04/17 20:15
逆(変数のアドレスを列挙する)ならできなくもないけどね。
int a;
printf("aのアドレスは%pです。\n",&a);
264デフォルトの名無しさん:03/04/17 20:18
アドレスから変数名を割り出したい時ってどんな時だろう。
265242:03/04/17 20:20
不可能という事のようですので
1万行書きます・・・

ありがとうございました。
struct{char*name,int*ptr}pee[]={"a",&a,"b",&b,"c",&c,...};
for(i=0;i<sizeof(pee)/sizeof(pee[0]);i++)
printf("%s=%d",pee[i].name,*pee[i].ptr);
こんな感じにしといて、1行目のテーブルは自動生成か人海戦術で作れ。
267デフォルトの名無しさん:03/04/17 20:21
>>265
ねぇねぇ、どんな状況なの?ものすごく興味があるんだけど。
268242:03/04/17 20:23
>264
242のように全変数を変数名付きでダンプさせたい時です。
269デフォルトの名無しさん:03/04/17 20:24
>>268
>>242は変数名と変数の値を列挙しているだけですが。
なんでそんなことをしたいのか聞いているんだと思うけど。
もうほっといてやれよ・・・
272242:03/04/17 20:30
えーとですね・・
さまざまなシステムから使用される共有メモリ変数があるんです。
(ある領域に連続して宣言されている)
その変数はルール上読み込み専用としてるのですが値が壊れる事があるのです。
で、どこで壊れるのか、どのアドレス位置から壊れているのかを
調べる為に全領域ダンプさせたいのです。

で、今後もこのような事が想定されるので
単純にメモリの中身をダンプするのでは無く
変数名=値
という形でダンプする関数を作りたかったわけです。


>>272
デバッグ情報使えよ。MAPファイルとか。
ソースから変数定義を抜き出すプログラムでもつくってソースつくりゃいいじゃんか
>>272
その壊れた領域のアドレスを元にそれを参照している変数(言い方がおかしいな・・・)の名前を得たいってことか?
276242:03/04/17 20:38
>>274
当然1万行手打ちとかコピペなんて作業はしてませんよ。

ただ同じようなコードが1万行続くのがスマートじゃないなと思って
質問してみただけなんですよ。

ほかになんかあります?
>>276
そういうツールを探すか作ればよい。
278242:03/04/17 20:42
>275
アドレスから変数名がわかれば
FOR文で回しながら
変数名=値
をダンプできるなーと思ったんです。

>277
はい、とっくに作って実行済みです。
279デフォルトの名無しさん:03/04/17 21:19
#include <stdio.h>

typedef struct {
char name[20];
int height;
float weight;
} creature;

int main(void)
{
creature nullpo = {"Nullpo", 60, 30.0};

printf("&nullpo = %p\n", &nullpo);
printf("&nullpo.name =%p\n", &nullpo.name);

printf("nullpo = %u, %p, %c, %s\n", nullpo, nullpo, nullpo, nullpo);

printf("name : %s\n", nullpo.name);
printf("height : %d cm\n", nullpo.height);
printf("weight : %.1f kg\n", nullpo.weight);

return 0;
}
280279:03/04/17 21:20
//--------------------------------------//
&nullpo = 0064FDE8
&nullpo.name =0064FDE8
nullpo = 1819047246, 00006F70, , (null)
name : Nullpo
height : 60 cm
weight : 30.0 kg
//--------------------------------------//
構造体の勉強に取り掛かったのですが、詰まりますた。
nullpoとnullpo.nameのアドレスは等しいのにnullpoの中身を
見ると、(null)などと出てきて・・・
nullpoの中身の数字は何を表しているのか、教えて下さい。
お願いします。
281動画直リン:03/04/17 21:25
>>279
nullpo構造体の先頭アドレスだろ。
283282:03/04/17 21:46
ごめんウソ。
284282:03/04/17 21:54
つーか、構造体変数の値を参照しようとしたことない。
代入にしか使ったことないや。 nullpo2 = nullpo;
285279:03/04/17 22:16
レスどうもです。
これは、知る必要の無い事なのでしょうか?
それとも、私は何かとんでもない勘違いをしているのか・・・
とりあえず、勉強を進めまつ。
printf ("nullpo = %c, %s\n", *((char *) &nullpo), (char *) &nullpo);
これで動くでしょ。
>>242
search & replace & #define
288279:03/04/17 22:43
>>286
ありがとうございます。
わかりました。
289デフォルトの名無しさん:03/04/18 01:20
if(10==010)
printf("同じ\n");

同じと表示されないんですけど。
010って8進数じゃないの?

10 == 8
>>251
というか、万単位の (おそらく静的な) 変数を
寿命も考えずに維持するというのは
莫迦のすることですよ。
いや莫迦にはできない。並外れた根気が必要だもの。むしろ電波だろ。
293bloom:03/04/18 01:54
294デフォルトの名無しさん:03/04/18 05:51
>>291
一つの関数の中に自動変数が一万個以上あるんですが・・・・
ちなみにその関数は43000行程度あります。
その関数をまず捨てろ。
一から書き直せ。
296デフォルトの名無しさん:03/04/18 07:42
特定のアプリケーションがインストールされていたり、インストールされたら何か反応するプログラムを作りたいのですけど
とりあえずどうすればいいでしょうか?
297bloom:03/04/18 07:54
#include <stdio.h>
int main()
{
if(fopen("/usr/local/bin/prog","r"))
printf("インストールされているね\n");
else
printf("インストールされていないみたい\n");

return 0;
}
>>295 がいいこと言った!

>>298
あけたらとじようみんなのファイル。
>>299
ファイル閉じる以前の問題があると思わないか?
>>296
C言語にはインストールと言う概念はありません。
OSが特定できればそれを知る手段があるかもしれないけど。

>>300
ネタだから構わないじゃないか。
fcloseしなくても、プログラムが終了すれば自動的に
クローズされるんだけどね。
#include <unistd.h>
#include <stdio.h>

int main ()
{
while (!fopen ("/usr/local/bin/prog", "r"))
sleep (60);
printf ("インストールされているね\n");
return 0;
}

これで何かまずいの?
終了したときにcloseしてくれるとか読んだような気がするんだけど
それはさすがにまずいだろよ
>>304
その理由を書いてくれないと。
>>303
fopen() の挙動について小一時間調べとけ。
Pascal初心者ですが、参考になるサイトなど教えてください。
>>307
何故ここで聞こうとしたのか、教えてもらいたいな
310デフォルトの名無しさん:03/04/18 17:13
scanfは空白文字も改行としてしまうので、それを解決するためにwhile、getchar、
getsなんかを組み合わせた2行ぐらいのがあった思いますが、教えてください。
>>310
こんなのはどうだ?

char buffer[256];
fgets(buffer, 256, stdin);
>>310
空白は改行にはならないぞ。
空白を含む文字列を取得したいなら、scanf()のマニュアルをよく読め。

念の為に言っておくが、「printf()とscanf()のフォーマット文字列は
互換性がある」だなんて書いてある入門書は捨てろ。
313デフォルトの名無しさん:03/04/18 17:39
名前空間の使い方を教えてくだされ。
>1
namespace hoge;
>>276
UNIXのfileコマンドの
magicファイルを自動生成するプログラムじゃ駄目ですか?
317デフォルトの名無しさん:03/04/18 18:25
>>301
windows
318310:03/04/18 18:28
お答えありがとうございます。
>>311 変数の宣言を含まずに2行だったような。EOFも使ってたような。
>>312 [\n]とか書くとできるのは知っているのですが、scanfでは無いのが
急に気になりだしてしまったので。
while((c=getchar())!=EOF)
こんなのを含んでたような。思い出せません。
なんだ、改行を探したいのか?
もう少し何がしたいのかはっきりしてくれ。
320デフォルトの名無しさん:03/04/18 18:56
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_Q 20 /*表示する問題の個数*/
#define MAX_LINE 128 /*入力行の最大数*/

void main(void);
void kuku(int questno);
void print_result(void);

int good_answers = 0; /*正解の個数*/

/*
* 関数mainは九九の練習をする。
* 問題をMAX_Q回繰り返す。
* 最後に結果を表示する
*/
void main(void)
321デフォルトの名無しさん:03/04/18 18:56
{
int i;
float rate;

/*現在時刻を使って乱数の「種」を得る*/
srand((unsigned int)time(NULL));

printf("これから九九の問題を %d 問出します。\n",MAX_Q);
good_answers = 0;
for (i = 0; i < MAX_Q; i++) {
kuku(i);
}
rate = good_answers * 100.0 / MAX_Q;
printf("問題は %d 問ありました。\n", MAX_Q);
printf("%d 問は正解したよ(゚〇゚)マルー \n",good_answers);
printf("でも%d 問間違ったよん♪バーカ(゚д゚)マズー \n", MAX_Q - good_answers);
prontf("正解率 %0.1f %%です。\n",rate);
printf("\n");
printf("ごっくろ〜さん♪")
322デフォルトの名無しさん:03/04/18 18:56
}

/*
*関数 kukuは九九の問題を一問出し、答えを待つ。
*正答、誤答の別を表示する。
*/
void kuku(int questno)
{
int x, y, result;
char buffer[MAX_LINE];

x = rand() % 9 + 1;
y = rand() % 9 + 1;
printf(" [第 %d 問] %d × %d =", questno + 1, x, y,);
fflush(stdout);
gets(buffer);
result = atoi(buffer);
if (x * y == result) {
printf("うむ、それでただしいのだ。\n");
good_answers++;
}
else {
printf("ざ〜んねん(みのもんた風に)\n");
}
printf("\n");
}
mainも宣言するとは珍しいな。
324デフォルトの名無しさん:03/04/18 19:22
学校で強制的に打たされたプログラムでつ
>>320
そのプログラム、いとも容易く暴走できるな。
static void hoge(void)
という関数があるのですが。
戻り値が static void になっているのは
どういうわけなのか理解できません。

どういう都合があるのでしょう。
>>326
関数内と関数外ではstaticの意味が全く違う(なんでそうしたんだろうね??)。
staticがついているので、そのhoge関数はほかのファイルからは呼び出せない。
328326じゃないけど:03/04/18 21:06
>>327
おぉー、なるほど。
勉強になった。
externの逆ということでintern(al)にすればよかったのにな。
C言語はなるべくキーワードを増やさない方針なのだ、とどっかで聞いた
autoなんて無意味なキーワードを加えているくせに ゴルァヽ(`Д´)ノ
332ポインター処女:03/04/18 21:45
ポインターはどんな時使うのか教えろ
ポインターを使うたびに5セントもらってたら今頃俺は大金持ちだぜ。
>>331
auto は、無意味じゃないぞ。
あそこには、static と auto が書けて、省略時解釈が auto になってるだけだ。
335326:03/04/18 22:12
>>327
ほっほー、わかりました。
336デフォルトの名無しさん:03/04/18 22:33
>>294
良く出来たコンパイラだな〜。
でも最適化は弱そうな雰囲気。
337デフォルトの名無しさん:03/04/18 22:46
未経験27歳でPGになります。
PGって、思ったより簡単みたいだね。
みんな!応援してね。
http://school2.2ch.net/test/read.cgi/job/1049610473/
339デフォルトの名無しさん:03/04/18 22:55
なんで配列の添え字は符号ありなの?
>>339
配列の添え字にunsignedしか使えなかったら不便じゃん。
size_tは符号なしなのに!!
342デフォルトの名無しさん:03/04/18 23:47
未経験27歳でPGになります。
PGって、思ったより簡単みたいだね。
みんな!応援してね。
http://school2.2ch.net/test/read.cgi/job/1049610473/
343デフォルトの名無しさん:03/04/18 23:51
初心者   Delphi
中級者   VB.NET C#.NET
上級者   C++
男根世代  C VB
女子高生  アッセンブラ
乞食     Perl
朝鮮人   Java
344デフォルトの名無しさん:03/04/19 00:03
Cのrand()関数を呼び出すとき乱数表から順番に取ってきてるんでしょうけど
初期値を変えられないですか?
runした時間によって変えたりしたいんですけど
>>344
srandじゃ。
>>344
一応言っておこう。
rand() 関数は、おそらく乱数表を使ってはいない。
世の中には線形合同法という洒落込んだ名前の付いた乱数生成アルゴリズムがあり、
乱数は計算によって生成されている。
まぁ、どのアルゴリズムを使っているかはコンパイラ次第であり、確実に線形合同法
が使われているかどうかは俺の知識を超えるがな。

でもって、たいていのアルゴリズムでは、乱数を利用するための初期値が必要になる
のだが、そのために srand(int) という関数が標準で実装されている。
話をまとめると、
「rand() を使うプログラムには main() の先頭に srand(time(NULL)) を書け!」
ということだ。マジレス終了。
>>345
>>346
ありがd
>>346
srandの引数はunsigned intだぞ。
srand(clock()) と言ってみるテスト
環境依存だけど、PIDを種にするのってあかん?
351346:03/04/19 01:21
>>348
わ。ほんとだ。誤文スマソ。
まーでも time() の戻り値も time_t なワケだしどーでもいーや〜。と逝ってみるテスト
352デフォルトの名無しさん:03/04/19 01:24
C言語で円を書きたいんですけどグラフィック関数使うんですよね?
図形を書くときって、特別な設定が(何かをインストールするとか)必要なんですか?
>>352
今の環境にそういうライブラリがなければ入手してインストールする。
>>350
(・A・)イクナイ
起動時にスクリプトなんかから自動的に起動されるプロセスの場合、
毎回毎回 PID が同じになる。慣習通り、time と組み合わせるのがいいと思うよ。
PIDとかいうなら、
/dev/randamからもってきたらええやん。
>>339
  int nul[65], *po = &nul[32];
として、添字の範囲を -32〜+32 ということにしたいのでしょう。
randam て。
>>349
clock()はプロセスが起動してからの時間だからやめた方がいいよ。
起動直後に呼ぶと毎回同じ値になる可能性がある。

srand((unsigned)(time(NULL) ^ clock()));でどうよ?
>>352
テキスト画面に描くとか。(計算は自前)
>>358
だから、おとなしく time(NULL) じゃダメなのか。
>>360
暗号には時間関数を使ってはいけない。
>>358
> 起動直後に呼ぶと毎回同じ値になる可能性がある。

なら、

> srand((unsigned)(time(NULL) ^ clock()));

も毎回同じ値になる可能性があるんでは?
363デフォルトの名無しさん:03/04/19 22:04
初心者です。
自分以外のEXEを実行させるプログラムを
教えてください。
正規表現なんですけど
char で放り込んだ変数の判断なんですが
perlの場合の if($hoge =~ /.jpg$/){}のように
if文書きたいんですけど
Cだとどうかくんでしょうか?
>>363
入門書買ってきてください。
366363:03/04/19 22:45
3日でわかるC言語には書いてませんでした。
初心者向けの講座があるサイトも結構回ったんですけど
解説してる所はありませんでした。
使う命令だけでもいいんで教えてくれませんか?
if ( !strcmp(hoge,"/.jpg") ){}
>>366
exec
spawn
>>366
system(),fork(),exec*(),pipe()

Windowsなら
ShellExecute(),CreateProssece(),

あたりか

370363と366:03/04/19 23:07
ありがとうございます。
>>368
なぜ標準のsystemを教えない。
>>369
綴り間違い
CreateProcess
>>367
そりゃちゃうやろ。

>>364
適当な正規表現ライブラリを探すか、自分で作れ。
if($hoge =~ /.jpg$/){} ぐらいなら難しくはない。
sscanfでできないかなぁ。。。。
375374:03/04/19 23:31
あ、だめだな。
>>364
regex は?
377364:03/04/20 00:10
うーん 正規表現というか
引数与えて 最後の4バイトを返すやつで判別するほうが
楽かな?
C言語は昨日はじめたばかりでWebとかいろいろ探しているんですけど
難しい・・・
#include <string.h>
int endsWith(const char *str, const char *suffix) {
return (strstr(str, suffix) - str) == (strlen(str) - strlen(suffix));
}
379363:03/04/20 00:20
#include <process.h>
main()
{
execlp("てすと.exe", "てすと.exe", NULL);
return 0;
}

一応できました。とりあえず正常に動いてるんですが
無駄な部分や、もっと簡略にできる部分がありましたら
ご指摘ください。
if($hoge =〜 /\.jpg$/){} と言ってみるテスト。本質ではない。
>>377
要は拡張子の判定がしたいみたいですが。だったら、

ext = strrchr(path, '.');

で、ext に文字列が入ります。ドットが含まれていない
場合には ext が空っぽなので、直後に if で例外処理を
適当にやってみてくださいな。
>>379
exec は成功したらそこで終了です。
なので return(0); には来ません。来るとしたらそれは
exec に失敗しているので、exit(1); とかじゃないでしょうか?

383山崎渉:03/04/20 03:35
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
なんでstrrchrはあるのに、strrstrはないのだろう。
>>377
そもそも環境は ?
拡張子を判別したいと言うのなら、環境によってはパス名称を分解するライブラリ/API を持ってたりするから、それ使った方がわかりやすいと思うぞ。
元々gd1.8.3がマシンに
ユーザー権限でgd2.0.12をインストールして
簡単なやつ
# ttp://www.ed.kagu.tus.ac.jp/~tbn/prog/gd.html
みたいのをgccでコンパイルしたいのですがうまくいきません

gcc -o sample -I/home/test/tmp/include -L/home/test/tmp/lib sample.c -lgd -lm
でコンパイルは通るのですが
実行すると
./sample: relocation error: /usr/lib/libgd.so.2: undefined symbol: jpeg_resync_to_
restart
となりうまくいきません

Delphiみたいに実行時のパッケージをつかって構築みたいに
外部ファイルを使わないで実行できるようなコンパイルオプションは
ないのでしょうか?

libjpegやlibpngなどはリンクでかまいませんが とりあえずgdが入って無い
システムでも動くようなバイナリを作るのは無理なのでしょうか?
387えんぴつ:03/04/20 09:27
>山崎渉くん
(僕がブルーだって言ってるのにレスが笑顔でぬるぽ・・・)
(流石だ・・・)
  ∧_∧
 ( ´∀`)< ぬるぽ
388えんぴつ:03/04/20 09:27
すいません、誤爆です…。
389デフォルトの名無しさん:03/04/20 09:46
-Bstatic って gcc で使えなかったっけ?
#include <stdio.h>
と書くと /usr/include/stdio.h を読みこみますよね。
しかしこれに書いてあるのは宣言だけなんですけど、
定義はどこから持ってくるのでしょうか。
#includeはその場でファイルを展開するんだよって答えで良いのか?
>>390
Lib からだよって答えで良いのか?
393390:03/04/20 11:39
stdio.h の定義なら
/usr/lib/libc.a でいいのかなあ。
-I や -L でヘッダやライブラリのパスを追加できるって感じですか。
デフォルトのものはどうやって調べるのでしょうか?
>>390
Linux だと標準では
ヘッダーは /usr/include
本体は /usr/lib
あたりかな。

C標準ライブラリだと、 /usr/lib/libc.a とか。

コンパイラオプションの -I -L とか調べてみては?
395363:03/04/20 11:57
382さん、ありがとうございます。
改良します。
396386:03/04/20 13:07
とりあえずccでメイクできるようになりました・・・
だけど既存のファイルを読み取って拡大するようなやつを
つくったら汚い汚い・・・GDModuleってこんなもんなの?
なんかカラーのがセピア色になってる・・・
質問です。
K&R本演習3-1,
binsearchのループ内のテストを一回で済ますプログラムを書けというんですが、
if
else if
else

if
else
にしろということなんですか?
ゲームボーイアドバスンをパソコンのジョイスティクとして使う標準関数は何ですか?
>>398

joy_gameboy_advacen()で検索してみ
400デフォルトの名無しさん:03/04/20 17:29
こんど、C++を勉強しようと思ったのですが
その前にCを覚えたほうがいいと思いCの勉強を始めました。
NS−DOS上で動くプログラムの習得、なんか、原始的な勉強を
しているような感じです。
こような考えかたを持つ者は、だめでしょうか。
>398
fopen()だよ
>400
今の時代、Windowsを使った方がいいよ。
メモリモデルとか意識しなくていいしさ。
403デフォルトの名無しさん:03/04/20 17:55
>>402
400ですが、そうですよね。
404デフォルトの名無しさん:03/04/20 17:56
>>400
そのMS-DOSってのは本物のMS-DOS?
それともWindowsのMS-DOSプロンプト(コマンドプロンプト)?
>400
MS-DOSならデバイスドライバを介さずに直接ハードウェアにアクセスできる利点はあるけどね。
NS-DOSとは、、、、
~
407デフォルトの名無しさん:03/04/20 18:06
>>404 WindowsのMS-DOSプロンプトですよ。
>407
んだったら
>403
なにが「そうですよね」だよ
馬鹿にしやがって
>>408
いやいや、16bitコムパイラつかってるなら問題ない。
410デフォルトの名無しさん:03/04/20 18:41
全ての環境変数を列挙するのは標準機能だけじゃ無理?
411410:03/04/20 18:42
envpは標準じゃないし、getenvはキーが分からないとだめだし・・・
ていうか、環境変数というモノ自体が標準じゃない
413410:03/04/20 18:59
>>412
ならなぜgetenvという標準関数があるんですか?
>>397
俺もそれわからんかった。誰かキボンヌ
>>397
問題がわからないが
再帰関数なら次の深さのifで代用?
プログラミングと いいおんな
どっちが すきだ?
>>415
問題は、二分探索で、ループ内の比較を2度ではなく1度しか行わないように変更する。
答:ループを抜けてから1度合致を判定する
どうしてDQNの耳には硬貨が入っていますか?
419デフォルトの名無しさん:03/04/21 13:41
初心者なんスけど、
ファイルポインタに標準入力(STDIN)をセットするやりかたが分かりません。
どなたか教えてくれませぬか?
FILE *fp;
fp = stdin;
fprintf(fp, "なんでこんなことしたいの?");
FILE *fp = stdin;
でもこれローカル変数じゃないと初期化できないよね。
なんかのソースを修正した記憶がある。
えうー、420はどういう結果を望んでいるんだ(w

>>422
stdinやstdoutが初期化されてないと駄目だからね
fprintf(stderr, ">>420 なんで入力用に開かれたストリームをfprintfに渡すの?");
>>420&421

ども、ありがd
参考になりますた!!
426デフォルトの名無しさん:03/04/21 16:43
初心者です。
VC++6.0で、現在Cやってます。

プログラム実行時、
ダラダラと文字が表示されるのが見にくいので、
コマンド入力ごとに画面消去がしたいんです。

いろいろサイト調べたら、
制御コード ESC [2J とか
printf("\033[2J"); /*画面消去*/

ってあったんで、コレダ!と思って加えたんですが、
変な文字が出るだけで消去できませんでした。

消去できない理由を教えてください。
for (i = 0; i < 8192; ++i) putc('\b');
putc?
429デフォルトの名無しさん:03/04/21 16:55
>>426
>printf("\033[2J"); /*画面消去*/
これはエスケープシーケンス文字列って奴なんだけど
Windows9.x系のOSしか対応してないはずだよ

試してないけどsystem("cls");で出来るかも知れない
ansi.sysが組み込まれていない
431426:03/04/21 17:04
僕のはXPだからだめだったんですね。
system("cls");
いけました!
答えてくれた皆様、
本当にありがとうございました!
432429:03/04/21 17:04
テスト終了でし、結果は予想通り。

#include <stdio>

main(){
printf("テストしてみますね\r\n");
printf("適当な文字列生成中もな〜");
system("cls");
printf("あれれ前二行が出力されてないもな\r\n");
printf("CTRL+Cで終了してね");
while(1);
}
433429:03/04/21 17:05
>>431
あらら、ご本人さまに先を越されてしまったw
つーことで頑張ってね〜
434デフォルトの名無しさん:03/04/21 17:08
逆にNT系で文字色の変更とかするときはどうすれば良いのやら
435bloom:03/04/21 17:08
MS-DOSの場合、コンソールでエスケープシーケンスを使うには
ansi.sys(or ansij.sys)が必要。
これはWindowsになっても変わらない。
>>434
CUIで色変え何て邪道ですぜ
>>434 猫とかに乗ってる物
#include <windows.h>
#include <stdio.h>
int main(void)
{
int a;
for(a=0;a<=255;a++)
{
SetConsoleTextAttribute((HANDLE)GetStdHandle(STD_OUTPUT_HANDLE),a);
printf("0x%02x ",a);
}
getchar();return 0;
}
439434:03/04/21 18:14
>>438
おお、ども。そんなAPIがありましたか。
440397:03/04/21 21:43
>>417
なるほど、最後まで繰り返すわけですね。
出来たがしかしあまり意味がないような。
441ぼぶ:03/04/21 22:08
Q0.1,E0.8,E0.4
正しい括弧付けかどうかをテストするプログラムを教えてください。
>>441
びっくりするぐらい情報不足なのは仕様?
443 :03/04/21 22:41
Q0.1,E0.8,E0.4
正しい括弧付けかどうかをテストするプログラムを教えてください…

>正規表現かどうかを調べるプログラムです

>>443
びっくりするぐらい情報不足なのは仕様?
参考書片手に勉強してるのですが、
とある例題で

ch = getchar();
if(ch < 'f' printf("その文字はfより小さい");

と書いてあるのですが

二行目 'f'とprintfの間に「)」が入るのでは?、と思いました。
この本のhpのミス訂正一覧にも乗ってなかったのでここで質問させていただきます。
教えてエロイ人(;´Д`)
>>445
コンパイラに聞けば答えがわかるのに。
>>445
あんたの言うとおり。
ミスプリなぞしょっちゅう出くわすものだ。いちいちツッコんでいては人生に疲れるぞよ。
なんでエロイ人限定なんだ
449445:03/04/22 00:04
っほ
自信が無く、不安でしたので・・・。
お二方、ありがとうございました。
しすぷり
>>448
解答を貰ってすっきりしたら夜の相手もお願いしようって魂胆では。
>>448
エロくなかったらCなんて習得できないだろ
453デフォルトの名無しさん:03/04/22 00:25
MS−DOSプロンプト上の文字のフォントサイズやフォント名を変更する事は
可能なのでしょうか?

可能だとすればどうすれば変更できるのでしょうか?
>>453
Cとは関係ないね。
>>453
確かjpとかusとか打つと出来たんじゃない?
456453:03/04/22 00:36
Cのコードからは可能でしょうかね?
>>456
やめとけ。
458453:03/04/22 00:41
どうしてですかね>>457
一部分のフォントを切り替えながら文字を出したいのか
全体的なフォントを変えたいのか。
どちらにしろ、>>457に同感
460453:03/04/22 00:47
>>459
一部ではなく全部です。
どちらにしろ、スレ違い
みんな、まともに答えてあげようよ・・・
標 準 C で は で き な い 。
>>1 を 見 よ
>>460
全体ならMS-DOSプロンプトのプロパティから変えれば。
464デフォルトの名無しさん:03/04/22 01:01
あの〜、授業でC言語の基本みたいなのを勉強したものなんですけど、
このC言語でプログラムを組めるとどんなすごいことができるんでしょうか?
今この世に存在してるソフト(ゲーム、PCのアプリケーション、電化製品内の
ソフトフェア)ってみんなC言語なんですか!?
趣味でこんなおもしろいことができるよ!とかあるんでしょうか?
みんなCでできてるわけではないが、Cがよく使われてますね。
>>464
この世に存在してるソフトがみんなCなら
他の言語は何のために存在してるんだよ! プンスカ!

...といっても、Cが多いのは確かだろうけど。

趣味なら、パソコン使ってて不便だと思うことを
プログラムで解決したりとか、
あとは適当にゲームでも作って遊ぶとか。
もっとハマると、ただ何かコード弄ってるだけで楽しくなってきたり...。
467464:03/04/22 01:36
>>465
>>466
レスありがとうございます!
ではフォートランやアセンブラにはないCのメリットやデメリットってのは
何なんでしょうか?ここまで多いのはなぜ!?
>>467
適材適所。
メリットデメリットなんて、ターゲットにもよるし、人にもよるし。
多いといわれても、何を基準にしているかにもよるから、ナンセンスかな
UNIX厨はCを使いたがるね。
>>464-468
その手の話はここ↓の“THE FUTURE”と“CREATORS ADMIT UNIX, C HOAX”を御参照下さい。
http://www.edfac.usyd.edu.au/staff/souters/Humour/Real.Programmer.Stories.html

つか、ネタ、及び自作自演はは他スレでやってね。











この期に及んで「適材適所」だってよ(プ
おまえらって最後はいつもそれな(ププ
楽しい?
>>470
んじゃ、適材適所じゃない、どんな用途にも使える言語ってのを教えてくれ。
472デフォルトの名無しさん:03/04/22 01:57
数値計算のコードを書いてるのですが、要求サイズが
大きすぎるのかmallocに失敗してその対処に困っています。
大きな領域を一度に確保する良い方法は無いでしょうか?
>>472
メモリ増設
>>472
何バイトくらい要求しているんだ!?
>>473
うん。つまらんことで悩む時間を考えるとメモリ増設なんて安いもんだ。
どうせ来年あたりにはオンボード1Gbyteが普通になるんだろうし。
とりあえず動作確認用に使ってるテストデータで、
mallocに失敗する要求サイズは25920byteです。
失敗するまでにこの5〜6倍程度の領域を既に
確保しています。
サイズとしてはあんまり大きくないと思うんですけど・・・。

あと、開発に使ってるマシンに積んであるメモリは512MBなので、
余裕はあるはずなんですが。
>>472
まず、どれだけのサイズを確保しようとしてるのかを確認しる。
一度で確保出来ないなら、分割して確保出来るかを確認しる。
デバイスドライバやカーネル周りでも無ければ、
本当に連続した領域が必要な事は少ない。

>>メモリ増設とか言ってる香具師
C言語の範疇では無いのでスレ違い。
8 bitプロセッサでも16bitプロセッサでもCは動く。
まぁ472が組み込み系で無いと思うのは同意だが。
>>475
うちでは32GB積んでいるが、それでも足りない。
mallocが返す領域って連続していると保証されているの??
480479:03/04/22 02:11
s/が返す/で得られる/
>>476
環境は?
>>481
Pen4 2G Mem 512MB
RedHat 7.3
GCC 2.96
です。
>>482
実行環境も同じだよね?
mallocで失敗するとは思えん・・・
484483:03/04/22 02:22
mallocがNULLを返しているんだよね?
>>484
開発兼実行環境です。NULLが帰ってきてます。
最初の発言以降mallocと書いてますが、実際は
callocを使ってます。
calloc の呪い
>>482
limitだろ。
ulimit (cshならunlimit) してから実行しなおせ
ああそうか。rlimitがあったか。
489デフォルト名無しさん:03/04/22 16:49
質問です。ほとんど出来ているのですが、1〜5までの合計(15)を5の横に置きたいのですが最後に表示されちゃいます。
どなたか助けていただけないでしょうか?よろしくおねがいいたします。
#define MAX_ROWS 6
#define MAX_COLS 50
#include <stdio.h>

void rowtotal(int table[][MAX_COLS], int rowadd[]);
int main()
{
int table [MAX_ROWS][MAX_COLS];
int a=1,x,y;
int row[MAX_COLS] = {0};

for(y=0;y<MAX_COLS;y++)
{
for(x=0;x<5;x++)
{
table[x][y]=a;
a++;
printf("%3d ",table[x][y]);
}

printf("\n");
}

rowtotal (table, row);

fflush(stdin);
getchar();
return 0;
}
490続き:03/04/22 16:50
void rowtotal(int table[][MAX_COLS], int rowadd[])
{
int row;
int col;

for (col = 0; col < MAX_COLS; col++)
{
for(row = 0; row < 5; row++)
rowadd[col] += table [row][col];

}

for (col = 0; col < MAX_COLS; col++)
printf("%d\n", rowadd[col]);
return;
}
 
for(y=0;y<MAX_COLS;y++)
{
    for(x=0;x<5;x++)
    {
    table[x][y]=a;
    a++;
    printf("%3d ",table[x][y]);
    }
    //合計表示はここでしょうに。
    printf("\n");
}
こういう風に表示したいということかな?
1 2 3 4 5 15
6 7 8 9 10 40
11 12 13 14 15 65

だとしたら、各セルを表示するロジックと合計値を表示するロジックが
完全に分離されている現状ではカラム制御しない限り無理。

っていうか、今のロジックって、
main()
{
 値設定と表示ループ
 合計値計算と表示()
}
って作りになっているけど、気持ち悪いし上述の問題があるので
main()
{
 値設定() /* これくらいならループでもいいか */
 合計値計算()
 合計値セルを値セルと連結()
 表示()
}
ってすれば汎用性が高い部品を幾つも作れて楽しいかと。
>>491
C++にしないように。それと、現行ロジックはまったく無視しちゃうわけね。
>>492
は?MAX_COLSが分ってるならtotalの配列も作れるでしょ?
全然Cだし、ロジック殺してないけど?
495デフォルト名無しさん:03/04/22 17:22
そうです、1 2 3 4 5 15 という感じで表示させたいのです。
table[5][MAX_COLS]の位置に合計を表示させたいんですが。。。
どうも、うまくいきません。ご教授よろしくお願い致します。
int table [MAX_COLS][MAX_ROWS];
int total [MAX_COLS];
こうしたほうがいいんじゃないのかな?

rowtotal(y,table,total);
でこれで処理できるようにする。

あとは>>491を参考に。


rowtotalを一括でやっちゃいたいのなら
make_table(table);
make_total(total,table);
view_matrix(table,total);
と三段階に分けたほうがいいかな。
497デフォルトの名無しさん:03/04/22 17:48
melon:   100
apple:   70
banana:  50
      ↑このように、特定の位置に頭を揃えて出力する方法はありますか?
いつからCに//なんてキーワードが追加されましたか?
>>497
printf("%6s: %-3d",kajitsu, nedan);で出来ん?
C99ていうくらいだから1999年から?
>>497
sprintf()を駆使しろ。
char buf[適当な長さ];
sprintf(buf, "%-10s%d", "melon:", 100);
:も自動化したかったら,
char buf[適当な長さ];
sprintf(buf, "%s:", "melon");
sprintf(buf, "%-10s%d", buf, 100);
>>497
printf("%10s%d","meron:",100);
printf("%10s%d","apple:",100);
printf("%10s%d","banana:",100);


printf("%-10s%d","banana:",100);
かもしれん。リファレンスみてちょ。
503デフォルトの名無しさん:03/04/22 18:00
>>499-502
どうもありがとうございます。
>>503
ちょっとだけ凝るなら>>499-502の両方の利点を生かして
sprintf(formatstr, "%%ds: %-%dd", kajitsulen, nedanlen)
printf(formatstr, kajitsu, nedan);
とかやってもいいかも。
>>504
それを書くなら、
printf("%*s:%-*d", kajitsulen, kajitsu, nedanlen, nedan);
だろ?
なぜ文字列処理という簡単なことでまともなコードがかけないんだ?
>>505
いや実際はループしてるんだし先にフォーマットを決めちゃわないと

>>506
正規表現なんて未だに情報処理試験の問題に出てくるらしいし
エンコード、デコード、正規表現・・・文字列を舐めちゃいけない
文字列処理が簡単だったらPERLなんて流行ってないよ
ここでやっている文字列処理は簡単だろ?
>>508
「ここでやっている」って事なら同意。

これはC言語が入門用に勧められてるのが原因じゃないのかな?
C言語に始まりC言語に終わるってのが現状だし。
ビジネスアプリな人はCに戻ってこないけどねw
入門用というのが勉強用。
ビジネスアプリというのが
実用的なアプリということなら同意。
>>498
キーワードではないと思う。演算子もキーワードではないでしょ。
512デフォルトの名無しさん:03/04/22 20:01
コンパイルに15分もかかってしまうんですが。そんなもの?
マシンとモノによる
昔Xフルビルドすると一晩掛かったもんだ。
>>512
コンパイラにもよるけど一般的にコンパイル速度を上げるには、
・コンパイラが使えるメモリを増やす。
・極大な関数があるなら分割する。
・(C++なら極悪なテンプレートは避ける)
・最適化を省略する。
・Makefileを使っているなら無駄なコンパイルをしてないかチェックする。
といった辺りをチェックしてみてはいかがでしょうか。
>>512
高いマシンを買って-O2オプションを付けてコンパイルすると幸せになれるよ
BCの話だけど
>>514
> ・極大な関数があるなら分割する。

ためしに数万行もある関数をコンパイルしたらVC++がフリーズしたっけな。
> ・(C++なら極悪なテンプレートは避ける)
STLは見逃して
518デフォルトの名無しさん:03/04/22 20:37
double **u;
の**って何です?
検索しようにもアスタリスクは検索演算子として見られてしまって検索できません。

強化版ポインタか何かですか?
教えてくださった方には山梨県を差し上げますのでどうかお願いします。
519  :03/04/22 20:38
正しい括弧付けかを判別するプログラムを教えてさい。

例えば
(()())は正しく
)()(や(()))みたいに正しく括弧付けされてないものは誤りである
といったようなことを判別するプログラムを書きたいのですが…
>>519
今ぱっと思いついたのは
1.数えてる途中で')'の数が'('の数を上回らない(同じ数になるのはOK)
2.最終的に'('の数と')'の数が等しい
を満たしてりゃいいんじゃないの?
>>512
Delphiなら一瞬です。
>>519
この間それにつかえるアルゴリズムを勉強したでしょ?
>>519
春の基本情報処理試験に出たね。
>>519
再帰関数を使うと言う手もある。
・文字列に対する参照ポインタを用意する。
・文字列を回して最初に)がきたらエラーを返す。
・最初に(が来るなら参照ポインタを文字列をそのまま自分に放り込む(再帰)
・再帰から抜けたあと、)が無ければエラーを返す。

でも>>520さんの方がスマートかな?
マルチにレスすんなよ
>>524
コンパイラ屋さんとかを目指すならこっちだけどねぇ
==が正しいかとか他の構文解析も追加しやすそうだし
スタックが64バイトしかないの。
>>519

'(' が出てきたら、 count++;
')' が出てきたら、 count--;

途中で count<0 になったら正しくない。
最後まで読みこんで、 count!=0 だったら正しくない。


"〜"、 '〜'、 /*〜*/、 //〜\nの間はカウント停止。
>>479
保証されてないと無茶苦茶困ると思うが。

>>485
calloc/malloc してる所は他にないのか ?
バグでメモリ管理領域が壊されてるに、一票。

>>519
マルチはやめてね。むこうに、>>520 と同様のアルゴリズムで書いといたから見といてくれ。

>>524
単に括弧の対応だけなら、>>520 でいいとおもうけど、括弧の中を解釈する必要があるようなら、再帰の方がいいかも。
531529:03/04/22 21:07

最後の行はオプショナル
文字列処理が熱いね、簡単なパズル何だけど解答例が複数出たりする。
いっそスクリプト言語開発できるくらいにはなって欲しいね

>>519 でもマルチはダメだよ。
>>518
ポインタのポインタ。検索キーは「ダブルポインタ C言語」あたりで。

>>520-532
何故、>>519ばかり相手にして、>>518の相手をしない?
質問内容は釣りとしか思えんが、最後の二行はむっちゃ面白かったぞ。
>>487
unlimitしてもallocに失敗したんですが、最適化オプションを
外してビルドしてみたらうまくいったようです。
ただ、コードを眺めてみると作りかけの関数を無理やり
呼び出したり、引数がおかしかったりと、コードそのものが
バグだらけなので、その辺を解決しないことには始まらない
話でした。お騒がせしました。

>>530
仰る通りです。バグつぶしに勤しみます。
>>533
> 何故、>>519ばかり相手にして、>>518の相手をしない?

??? 自分で答え書いてるやん...。

> 質問内容は釣りとしか思えん
536デフォルトの名無しさん:03/04/22 23:55
scanf("%[0-9]","0123456789abcdef");

scanf("%[*]","0-9","0123456789abcdef");
見たいにしたいのですが、うまくいきません。
scanf("%.*s",5,"0123456789abcdef");
みたいに整数値ならできるのですが。正しいやり方を教えてください。
できないコードを示されて「こうしたい」と言われてもな。
何がしたいんだよ。
0桁から9桁の整数値を変換したいってのなら「scanf()単独ではできない」と答えておくが。
538518:03/04/23 00:28
>>533
親切に検索語までお教え頂き、真にありがとうございます。
あとはそれを手がかりに道を模索する事にします。
山梨県は差し上げますので、今後自由にお使いください。
>>536
こういうことならできるけど。

#define REGION_DIGIT "0-9"

char str[128];
sscanf("0123456789abcdef", "%[" FORM_DIGIT "]", str);
puts(str);
エスケープシーケンス \v (垂直タブ) はANSI 規格のはずなのに Windows2000+cygwin
では垂直タブの変わりに変な記号が表示されます。
何が悪いのでしょうか。
>>540
Microsoft
お答えありがとうございました。
>>537 エラーチェックを含めた入力関数を作りたいのです。例えばこんな感じです。
void GetsForOk(char*message,char*errorCheck)
{
char s[256],s2[256];
for(;;puts("入力エラー。やり直し"))
{
puts(message);gets(s);
if(!strlen(s))continue;
sscanf(s2,"*",errorCheck,s);
if(!strcmp(s,s2))break;
}
}
>>539 マクロならできるのですか。ただ、()が無いと言うエラーになってしまいます。
キーワードを元に調べてみます。
>>542
Real programmers don't use `for`.
544539:03/04/23 03:34
>>542
ごめん。FORM_DIGIT は REGION_DIGIT に変えて。
名前に悩んでたら混ざっちゃった。
545536:03/04/23 04:05
>>543 戻り値タイプのほうがいいのですか?>>542のだと1発でできるので楽かと。
他にいい方法があるなら教えてください。
>>544 なるほどそうでしたか。名前が違うのは何でだろうと思ってました。
直したらできました。ありがとうございました。
>>543は、なぜforを使うなと言ってるのか聞きたい。
>>546
ネタだろ? >>470 の。
548デフォルトの名無しさん:03/04/23 05:31
小町算に興味を持ち、プログラムを作成してます。
現在、式文字列の生成は完了して、演算部分の作成を行ってます。
で、質問です。

 "1+2/3*4+557+89"

の様な文字列の計算結果を求めるのに簡単な手法は有るでしょうか?
lex,yacc 等は使える環境にありません。

要素単位にばらして順次処理するしか無いかなぁ...
a 数字と括弧(cを使って)を処理する
b aを呼び出して掛け算と割り算を処理する
c bを呼び出して足し算と引き算を処理する
これでできると思うけど。
550名無し@沢村:03/04/23 08:03
おまいらよ、すべての変数はグローバルにすべきだよ。
ふつーグローバル変数はどこからアクセスされるかわからないから危険だといわれるが、
危険性はまったくないよ!!
おまいらよ、考えてみろよ、グローバル変数がネットで公開されているのか?
そして不特定多数のネットユーザーがグローバル変数に勝手にアクセスするとでもいうのか?
そんなわけはないだろ!!
グローバル変数なんて開発環境の中にしかなくて、そのプログラムを開発しているものしか使わないんだから、
勝手にアクセスされて危険ということはねーんだよ!
>>550
馬鹿。 それしか言えない。
552デフォルトの名無しさん:03/04/23 08:10
HeapやStackを中級車はやたらと多用したがるが、特にHeap変数はバグの
根源だし、Stackも同様に使い過ぎは毒
よって>>550にも一理あり。
>>550
世の中絶対ということはない。
スーパーハカーならネットワーク経由でグローバル変数に不正アクセスできるかもしれない。


書いていて情けなくなる(鬱
555名無し@沢村:03/04/23 08:35
>>554
いや、スーパーハカーでもネットにもLANにも接続されていないPCで開発を行なえば不正アクセスはできないよ。
電話線とモデムを失念しているようだな
甘い。CPUやメモリ等が発生するノイズが電線に回り込み、それを
解析すれば、CPUが実行している命令を解析出来るらしい。
起動時から全部チェックすれば、スパイ位は出来るらしい。

(ウソ)
558名無し@沢村:03/04/23 08:52
>>557
甘い。電線にも接続されてない充電式のノートPCで開発を行なえば、不正アクセスはできないよ。
沢村って誰?ま、いいけどさ。

グローバル変数の危険性は自分が馬鹿をやる可能性があるということ。
それからコンパイラの最適化がしずらくなる可能性がある。

まあ(DISK版)N88BASICでも一生やってなさいということで。
ちょっと聞きたいんですが、

strcmp とmemcmp の違いってなんスか??

どなたか教えてくだせぇ・・・
藻前ら、沢村なんかに釣られんなよ…。
>>560
その前に、あなたが調べた事を書いて下さい。
G(o^−^o)gle <検索しようね
ぐぐれば分かるさ
よく説明を読め
>>560
せめてstr"n"cmpとの違いは?にしようよ。。。
>>548
前に作ったものですが。括弧つき。少数以下は切り捨て。参考にどうぞ。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=63
他にも再起呼び出しでやるのもあるらしいです。
>>548
bcコマンドを呼び出すとか(笑)
>>548
小町算・・・前に2行で書いたらソースが滅茶苦茶汚くなったなぁw
569デフォルトの名無しさん:03/04/23 14:59
WindowsのVCでコンパイル・実行できたプログラムをUNIXに移すと、
gccでコンパイルはできるんですが実行するとSegmentation faultが出てしまいます。
原因はどんなものが考えられるでしょうか。
570デフォルトの名無しさん:03/04/23 15:00
>>569
文字列定数("で囲まれたやつ)を書き換えていないか?
バグがある
>>571
正解。

あと二度freeもVC++では落ちなかったような・・・
573536:03/04/23 15:12
やりたかったことができました。>>539さんのマクロをヒントに関数そのものをマクロに
したらうまくいきました。ありがとうございました。あと、sとs2が逆でした。
sprintfは(s,"%s",s2)s2をsだったので、そのまま使っていたのですが、
sscanfは(s,"%s",s2)sをs2にだったんですね。
#include <stdio.h>
#include <string.h>
//Gets+ErrorCheck MSG:入力を催促するメッセージ SSM:書式指定文字列
#define GETSPP(MSG,SSM) for(;;puts("入力エラー。もう一度入力して下さい")){puts(MSG);gets(s);if(!strlen(s))continue;sscanf(s,SSM,s2);if(!strcmp(s,s2))break;}
int main(void)
{
char s[256],s2[256];
GETSPP("数値を入力して下さい","%[0-9]");
return 0;
}
> if(!strlen(s))
if(*s)でいいじゃん。
>>574
if(!*s)な
#include <stdio.h>

int main(void){
int* a;
*a = 5;
int b = 4;
printf("%d\n",(*a)+b);
return 0;
}

↑これでコンパイルはとおるけど、実行させたら
Segmentation fault (core dumped)
とかでます。
*aでint型のポインタの実体を指しに逝ってるから
いけると思ったんだけど・・・
*a ではなく a の値はナニよ?
つまりint型へのポインタ変数 a はナニを指しているかという
578548:03/04/23 18:55
>>566
なるほど、算術記号が無くなるまで文字列を変形させる訳か。
バッファを大きめに取れば実数対応できるかな?
参考になりました。
>>574-575
なるほど。getsで何も入力しないで改行を押すと先頭に'\0'が入るから
*sは先頭の値を指すので、ぴったしですね。使わしてもらいます。
>>576
*a=5;の前にa=malloc(sizeof(int));
ちなみにそれは文法違反になるはず。Cでは変数宣言はブロックの先頭にまとめる。C99は知らないけど。

>>575
ありゃ。。。スマソ 長さが0の時に真にするんだよな。。。
>>578
C99でもそれはNGだったはず
>>576
そんな風に使うんならポインタじゃなくていいやん。

int main(void){
int  c, b = 4;
int* a = &c;
*a = 5;
printf("%d\n",(*a)+b);
return 0;
}

なら、おっけー。つまり>>577のいう通りなんだけど。
あるいは>>580
要するに、ただ単純に、ポインターが解ってないだけやんか
584デフォルトの名無しさん:03/04/23 22:27
0やNULLは偽ですけど、0.0は偽になるとは限らないですよね?
いや、なるでしょ?
その前提で結構書いちゃってるけど。
586584:03/04/23 22:37
>>585
VC++6.0では偽になったんですけど、保証されているのかなぁ・・・・
if (0.0 == 0x00) printf("equal (・∀・)");
で試すがよい。
588584:03/04/23 22:44
>>587
0がdoubleに格上げ(?)されてイコールってことですか?
イコールになりました。

C++ではC++の本に偽になることを期待したコードがあるんで多分保証されていると思うんですけど。
589584:03/04/23 22:45
とりあえず偽になると覚えます。
590588:03/04/23 22:48
なんか変なこといっているな・・・・
0.0は0をdoubleにしたものだから0と0.0は同じ・・・・同じということは0.0も偽となるか。
>>588
何故比較対称が0でなくNULLでもなく、0x00なのかということに着目するといいよ
if(! (int)0.0) printf("false (・∀・)");
>592
キヤストするならそりゃそうだろ。
>>591
なんで?
>>593
そりゃキャストするだろ。アフォ?
>>591
なんで?
>>592
intにキャストする必要は無い
0.0は偽
printfは使用禁止!と言ったらfprintf(stdout,...)にしやがったぜあの馬鹿。
禁止にした理由を言わないからだろこの馬鹿。
599592:03/04/24 00:36
>>596
そうなんだ
内部的に int にキャストしてると思ってた
>>597
何で代用するのか指定しておかないからだろ、この馬鹿
windowsプログラムとかのソース見てると
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
っていうのがあるけど、これは絶対書かないといけないの?
>>601
コンパイルしてみそ

#include <stdio.h>
#include <windows.h>
int WINAPI WinMain() {
    MessageBox(NULL, (LPCSTR)"(*・Д・)", (LPCSTR)"", MB_OK);
    return 0;
}
printfでlong型の変数の数値を出力したいんだけどintにキャストしなきゃ駄目なの?
intとlongでサイズが違う場合はオーバーフローとかが問題になると思うんだけど。
%ld
>>603
ぬ?printfのフォーマット指定にlong専用のものってあったっけ?
いつも%dしか使って無いからよくわからないけど
可変個の引数の場合は整数はみなintになるんじゃなかった?
>>606
intより小さい整数は格上げされるが、大きい整数が格下げされるわけではない。
printf()のマニュアルくらい読むべきだな。
printfのマニュアルじゃなくて可変個引数についての説明だと思われ。
printf()のマニュアルを読んでも判ることだろ?
#define ERRDEF (-1)
みたいにdefine時の数値は()で括らないと問題あるの?
よく言われる話だけど・・・
既出だったらスマン
あります。
612見習中:03/04/24 15:22
教えて下さい。

Win2000+cygwinでCの勉強中です。

質問
プログラムの実行時間を計測したいです。
ループ文等を変更して、実行時間がどう変化するか
調べたいです。


ぐぐってみたのですが、

プログラムのプロファイル(詳しい実行内容・時間)をとる
gcc で -pg オプションつきで コンパイルして実行すると
gmon.out というファイルができる. そこで gprof program-name


これは、上記目的をはたすでしょうか?
ほかに、これが良く使われる(一般的)というものがありましたら、
教えて下さい。よろしくお願いします。
>>612
はたす。
614デフォルトの名無しさん:03/04/24 15:28
初心者ですみません。
int a =3:
int array[a];
のように変数分だけ配列の要素を作ることってできないんでしょうか?
615見習中:03/04/24 15:33
>>613

ありがとうです!
やってみたら、時間が表示されました。
そのあと、色々なことが書かれています。
もうちょっと調べてみます。
>>614
int a = 3;
int *array;
array = (int *)malloc(sizeof(int)*a)
>>614
mallocはそのためにある。
int *array = malloc(sizeof(int)*a);

でもgccだと拡張機能(array of variable length)で
 int a=3;
 int array[a];
が通ってしまうのはヒミツだ。
>>617
C99にも含まれたけどな。
619デフォルトの名無しさん:03/04/24 15:39
>>616-617
malloc調べました。ありがとうございます。
>>610 四則演算時に困るからってのが一番の理由

たとえばクラスのテスト5科目の点数の配列があるとして
int *test = malloc( CLASSMATE * 5 * sizeof(int) );
とするならば

#define CLASSMATE 30 + 25 だとどうなるか?
30 + 25 * 5 * 4 だよね?

#define CLASSMATE (30 + 25) だとどうなるか?
(30 + 25) * 5 * 4

さてどっちが正しく処理されるでしょうか?
621おい!:03/04/24 15:40
C言語でドラえもん作れや!
              ____
           ./, - 、, - 、   ̄ ヽ
          ./-┤ 。|。  |――-、 ヽ
           | ヽ`- ○- ´ /  ヽ  |
           | -   |     ―   |  |
           |  ´  |    `ヽ  . |  |ヽ
  ∩      人`、 _  |    _.- ´ | .|  \
  |  ⌒ヽ /  \  ̄ ̄ ̄     ノノ       \
  |      |´      | ̄―--―― ´ヽ     _  /⌒\
  \_   _/-―――.| ( T )      `l     Τ(      )
       ̄       |   ̄        }      | \_/
             | 、--―  ̄|    /
FUCK YOU

ぶち殺すぞ・・のび太・・・・!

あるCプログラムを
vc++ からビルド・実行、するとちゃんと実行できるのですが
できた実行ファイルを直接実行しても何もおきません、
どこが悪いのか見当つきませんでしょうか。
>>622
プログラムの一番最後にgetchar();を書く。
>>621 感動で泣けよガキ

#include <stdio.h>
#include <windows.h>
int WINAPI WinMain() {
MessageBox(NULL
, (LPCSTR)("                             / ̄ ̄ ̄ ヽ\r\n"
"                __           /ヽ)―- 、   l\r\n"
"           ,―γ ___ヽー、       q`´ハ ミ ヽ  }\r\n"
"       | ̄ ̄|  | |(/),(ヽ)|    | ̄ ̄|   <_))_,  |  /\r\n"
"      |   ヽ  (6  ー  )  ノ    |    ヽ ___/_ノ\r\n"
"      -――  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄――-    (t) ̄ ̄ ̄|\r\n"
"     |  ,―  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ― 、    |    (/_ )/ / |\r\n"
"     |  |                |    |  ( ) ○    |-o\r\n"
"     |  |                 |    |   `ー―― ´\r\n"
"    |  |                  |    |\r\n"
"   |  |                   |   |\r\n")
, (LPCSTR)"", MB_OK);
return 0;
}
625610:03/04/24 17:51
>>620
ありがとうございます。
納得です。
>(LPCSTR)""
なんでそんなコード書くの?
>>610>>620
-1のような定数を括弧で括る理由の説明になっていない。
#define FOO -1
int a = -FOO;
#define FOOZ (-1)
int b = -FOOZ;
としたときに、前者はエラーになるが後者は正しく処理される。
何故ならば、それぞれ次のように解釈されるから。
int a = --1;
int b = -(-1);
>>624
カンマの位置が激しく気持ち悪い。
英語の勉強したら?
>>626
お察しください。
>>627 ・・・言ってることが激しく620と変わらないのだが?
>>629
式と定数の違い。
>>626=628
適当発言に適当ソースで返した奴にまで一々煽るな
>>630
()で括るのは式を定数化する為だという意味においてまったく違いが無い
1+1は式、-1も式
633デフォルトの名無しさん:03/04/24 20:23
externについての質問なんですが、

=== file1.c ===
int main(void)
{
int num = 10;

func();
return 0;
}

=== file2.c ===
extern int num;

void func(void)
{
numをごにょごにょ
}


なにがおかしいんでしょうか?
634bloom:03/04/24 20:26

int num = 10;

int main(void)
{
func();
return 0;
}

=== file2.c ===
extern int num;

void func(void)
{
numをごにょごにょ
}
>>633 externはグローバルだけだよん
>>635-636 
どうもです。
そこで小一時間はまってしまいました。
int main(void)
{
int num;

func(num);
return 0;
}

=== file2.c ===

void func(int num)
{
numをごにょごにょ
}
>>606
intより小さいサイズの整数型・文字型の場合は、
int型と同じサイズに符号拡張され、スタックに積まれる、
が正解(だと思う)。積まれたデータをどう解釈するかは
関数次第だから、「みなintになる」はちょっと表現が
微妙と思われ。
反例:__int64とか、long longとか、昔のlongとかネ。
>>640
何に対する反例?
642デフォルトの名無しさん:03/04/24 21:12
以下のように関数fooを呼び出して2次元配列を宣言し、
pに格納しようとしたのですが、コンパイルは通るものの
実行時にエラーが出てしまいます。どのように修正したら良いでしょうか。
よろしくお願いします。

int **foo(int a, int b);

main(void){

int **p;
p = foo(2, 4);
}

int **foo(int a, int b){

int **array = malloc(sizeof(int)*(a*b));
  return array;
}
>>642
エラーの内容を書かないという精神を修正したら良いんじゃないかな。
int **って二次元配列じゃないよ。
645名無し@沢村:03/04/24 21:37
おまいら、ちょっとC言語でプログラム書いてみろ?
できたらおれが見てやるから、見せてみろ。
お前が書け。俺が見てやる。
char *GetBetweenString(char **betweenstring, char *str,
const char *firststring, const char *endstring)
{
char *fpos, *epos;

if((epos = strstr(str, endstring)) == NULL) return NULL;
*epos = '\0';
if((fpos = strstr(str, firststring)) == NULL) return NULL;
*betweenstring = fpos + strlen(firststring);

return epos+1;
}
>>646
ヤツのを見てどうするんだよ
>>642
そのコードだけだと特に問題ないと思うが・・・。
他の部分でアクセス違反とか起きてない?

>>642
これがんばって読みなさい。
http://www.catnet.ne.jp/kouno/c_faq/c6.html#18
>>642
#include <malloc>をちゃんといれてまつか?
漏れのBCCちゃんは通してくれますたよ。
>>651
そういう問題じゃない。
mallocなんてヘッダーファイルはしらないなぁ。
malloc()はstdlib.hだろ。
あるよ。<malloc.h>だけどね。
>>653 いや普通にあるから安心汁
>>655
標準じゃないからああいう言い方しただけだよ(^_^;)
657656:03/04/24 22:14
VC++には.hのつかないのはないな。C++用か?
658642:03/04/24 22:15
「問題が起きたため、○○.exeを終了します。ご不便をかけて申し訳ありません。
この問題をmicrosoftに報告してください。」というのがエラーメッセージの内容です。

>>644
あ、間違ってますか??最初int **以外で宣言すると
「間接参照レベルがint*int**で異なっている」とコンパイル時に警告が出たので・・・

>>649
うーん…mainで配列に数値を入れて出力するだけなんで
問題ないと思うんですが・・見直します。

>>650
ありがとうございます。読んでみます
>>657
ん?#includeは拡張子を省略できるはずだけど
できねえよ。
はいはい。どこで聞きかじったんだ?
>>659
662657:03/04/24 22:20
>>659
ためしに#include <stdlib>ってやったらインクルードファイルをオープンできないと言われたYO
>>658
Microsoftに報告しても解決しねーだろうな(苦笑
拡張子省略できるのは C++ の標準ヘッダファイルな
>>642
>「問題が起きたため、○○.exeを終了します。ご不便をかけて申し訳ありません。
>この問題をmicrosoftに報告してください。」というのがエラーメッセージの内容です。

多分OSはXPだろ?妙に過保護なんだよな…。
>>664
あれは省略してるわけじゃないぞ。
たとえば <iostream> と <iostream.h>は別物だ。
667664:03/04/24 22:26
だね。書き方が悪かった。
>>632
いまさらだが...

> -1も式

ハァ ?
>>666
正しいんじゃないか?
g++ではstdioなんてファイルがないのに、#include <stdio>はOKだったぞ。gccではだめだけど。
670669:03/04/24 22:28
Visual C++ 6.0ではC++としてコンパイルしようとしてもだめだけど。。。
>>668
ハァ?
じゃねえよ。正しいよ。お前が馬鹿。
>>669-670
処理系依存なんだから正しいとは言えないだろ。
673649:03/04/24 22:31
>>642
GCCでコンパイルしてみて実行してみたが
問題なく動いたぞ。
main(void){

int **p;
p = foo(2, 4);
p[0][1] = 5;
printf("%d", p[0][1]);
}
無事5と表示された。
674669:03/04/24 22:32
>>672
うーむ・・・まあ拡張機能はOFFにしなかったけど・・・
>>673
そりゃ「たまたま」正しく動いただけだ。
>>673
パパあのまま流用したらメモリリークだよ・・・
677672:03/04/24 22:36
>>674
まぁ「正しい」の定義にもよるけど、標準Cの規則に準じてれば
正しいって解釈でいいよね。だったらg++の例は不適切。
おれがコンパイラつくって(作れないけど)独自に
#unko- <stdio.h>
でもインクルードできることにしてたとして、おれのコンパイラ
で動くから「正しい」って変でしょ?
0-1 という暗黙の展開があるから -1 という「式」が -1 という「値」として扱える
でも何故か 4N という式は 4xN とは展開されない
コンパイラは必ずしも四則演算の要件を満たしてるとは言えないね
int **pはポインタのポインタだろ。
p[a]はポインタになるだろ。
で、ここにきちんとint型のポインタを入れないといけない。
680デフォルトの名無しさん:03/04/24 22:39
>>678
C言語と数学は違う。ただそれだけのこと。
>>680の言うとおり。
ついでにC言語では4Nは式ではない。
int (*p)[5]=malloc(sizeof(int)*4*5);
4Lだと式だけどな(笑)
>>682
そりゃ正しいけどだめだろ。
>>642はプログラム中で任意の列数・行数を持つ
2次元配列(もどき)を作りたいみたいだから。
>>680 四則演算という規格について言ってるのだから数学云々は別
>>642
int **foo(int a, int b){

int i;
int **array;
array = malloc(sizeof(int)*a);
for(i=0;i<a;i++)
array[i] = malloc(sizeof(int)*b);

return array;
}
int a=7,b=10,i;
void *p1=malloc(sizeof(int)*a*b);
int **p2=malloc(sizeof(int *)*a);
for(i=0;i<a;i++)
p2[i]=p1+i*b;

できないかも。
688687:03/04/24 22:54
できないな。void *じゃ加算できないって。
689687:03/04/24 22:57
int a=7,b=10,i;
int *p1=malloc(sizeof(int)*a*b);
int **p2=malloc(sizeof(int *)*a);
for(i=0;i<a;i++)
p2[i]=p1+i*b;

こうかな。
690デフォルトの名無しさん:03/04/24 23:28
ファイルの指定位置から数バイト消すみたいな関数ありますか?
書くのは一杯知っているのですが。あるなら教えてください。
>>690
メモリに取っておいて切り詰めたい始端終端を取ってリワインドして
あとはガリガリってのではダメ?
>>683
4L は、定数だよ。
693690:03/04/24 23:57
>>691 それは今使っているやり方なんです。fprintfやfgetsで空入力しても
そのバイト分が消えて、空白や改行の2バイトに変わるだけですし。
>>692
定数だけ書いても式じゃないのか?
>>693
Cはそれほど詳しく無いから分らないけど
ファイルシステムの構造を考えると切り詰めるってのは無いと思う
バッファサイズが気になるならtempファイルを作ってリネームでとか
ごめん、この程度しか思いつかん
>>694 式だね
>>693
ファイルの途中を切り詰めるという関数は標準C(およびPOSIX)にはありません。
システムコールでも * 不 可 能 * です。
末尾を切るのならあるだろうけどなぁ。。。truncateとか。
残す部分だけメモリーに取って上書きじゃ嫌なんだっけ?
699690:03/04/25 02:13
お答えありがとうございました。
>>697 不可能なんですか。残念です。
>>698 今までは予め上限を決めておいて、セーブロードの時全てのデータを出し入れ
していたのですが、新しく作ろうとしている時そういえばあったっけとなってしまったわけです。
残す部分だけのは嫌ではないのですが、消す方法があるならそのほうがいいので質問しました。
700山崎トオル:03/04/25 03:31
700ゲット(^^)
なんか自分で考えてるうちに何がなんだかわからなくなってきたので
誰か愛の導きをください。

char *(string[32]);
0 ポインタ
1 ポインタ
2
3
...
31
というようにポインタを入れる32個の配列が確保される、ですよね?
では、char (*string)[32]; この場合はどういう事になるんでしょうか?

前者は、char* string[32];と考えてやればうまく掴めますが、後者がわかりません。
char型の宣言なので、例えば
(*string)[0] 文字
...
(*string)[31] 文字
って事ですかね。
なんか頭の中にメモりの図が描けません。
>>701

char (*string)[32];
char[32]を指すポインタ。二次元配列を指すポインタとでも覚えておけばいいよ。
703702:03/04/25 10:49
char *string[32]は配列だけど、char (*string)[32]は配列じゃなくてポインタ。指すものが配列。
704701:03/04/25 11:14
すいません。。。
なんか余計わけわからなくなりました。
これを2次元配列として利用するとしたら、具体的にどんな書式で書くのでしょ
うか?
>>704

void func(char (*string)[32]) // void func(char [][32])でもいいけど
{
// 何か
}

int main()
{
char a[10][32];
func(a);
return 0;
}
× // void func(char [][32])でもいいけど
○ // void func(char string[][32])でもいいけど
%s, %d
のように %記号 で表現するスタイルについて、用語がついていたと思うのですが、
どういう名前か教えてください?

手元の本には記述が見当たらなかったので。
printf()系の書式、scanf()系の書式
>>707
フォーマットじゃなくて%dとかの規格の名前ってこと?
>>708 プッ
激しく今更だが、>>627には適当なことを書くな、と言いたい。
>>711
--1じゃなくて- -1ってことのほかに何かある?
713れな:03/04/25 16:53
(課題1)
1000以下の正の整数値のうち,素数をすべて計算し,
その結果をファイルに格納するプログラムを作成せよ.
素数とは自分自身と1以外の数値で割り切れない整数のことである.
また、計算の実行の中で乗除(乗算と除算)を行った回数もあわせて表示し、
ファイルに格納すること
おねがい!!たすけてえええ
微妙にスレ違いかもしれませんが質問させてください。
Microsoftの日本のWebサイトの、MSDNライブラリの中には、C標準関数のリファレンスはないのでしょうか?
もし有るのでしたらアドレスを教えていただけないでしょうか?
716デフォルトの名無しさん:03/04/25 17:55
100+(0.000001)×1000000=100
(0.000001)+100=109.95…

なんじゃこりゃ???
>>715
互換性のところにANSIと書いているのが標準関数なのでは?
>>716 そういうことだ
>>707
変換指定
720デフォルトの名無しさん:03/04/25 21:48
100+(0.000001)×1000000=100
(0.000001)×1000000+100=109.95…
だった。
両方とも110になるはずなのに、なぜだ??
教えてください。
>>720
実数演算は誤差が出るんだよ。
実数演算じゃないだろ。
100+(10^-6)*(10^6)が110になるわけないやん。
>>722
実数じゃん。
>>720
全角で書くのはどういうことだ? 試させない気か?
問題は実数演算じゃないよ。
727720:03/04/25 22:24
floatで定義してるんです、これ。
それが関係してると思うのですが…
有効桁数の問題かな。
>>720
上は桁落ちを起こしてるんだろうけど、下はなんだろ?
てかこの程度で桁落ちしたっけ?>float
>>716 OSとコンパイラを教えなしゃい
>>729
有効桁数って6桁くらいじゃなかった?
732720:03/04/25 22:56
>>730
OSはLINUXで、コンパイラは分かりません!
>>732
分からないってことはないだろう。
CPUはIntel系(32bit)、コンパイラはgccか?
734733:03/04/25 22:59
あー、、浮動小数点数演算の誤差の話か、、、、
735デフォルトの名無しさん:03/04/25 22:59
http://school2.2ch.net/test/read.cgi/job/1050853932/l50

ダメ人事の転職相談( ´_ゝ`)

736720:03/04/25 23:00
>>733
あー、多分それです。
>>729
float? doubleじゃなくて?
x(0.000001)(1000000)(100)*+=
どっちもこう展開されると思うんだけどなぁ・・・
739720:03/04/25 23:05
floatは何桁まで取れるんですか?
>>737
倍密度浮動小数点数なら桁落ちはまずない(単密度と比べて)
>>720
下はあまりにも誤差が大きすぎる。
どうやって表示したの?
お前ら、情報処理技術者試験(基本情報技術者試験)を受けれ。
>>739
6,7桁くらい
同じような環境でどうやっても101.000000...になる・・・
>>742
そういう君は持ってるんだな?下の原因を教えてくれ
746720:03/04/25 23:13
#include<stdio.h>

main()
{
float a,i;
a=0;

for(i=1;1<=10000000;i++)
a=a+0.000001;

a=a+100;

printf("%f",a);

}
…確かこんなかんじです。
・・・・・。ループで足していたのかよ・・・・
これはまた誤差が出まくりそうな…
>>746
君のソースにループカウンタへの愛を感じない
まぁマテ、お前らの中で>>738を理解している奴がどれだけいるのか確認したい
これに関連するある国の名を挙げてくれ!
751747:03/04/25 23:16
じゃなくて、


     無限ループかよ!
>>749
一生ループしまくりだから、愛してるんじゃねーの?
753720:03/04/25 23:17
>>749
…気づいて自分でわらってしまた。
754720:03/04/25 23:18
iに直してやってみたら、また109.592110という結果でしたー
>>752 i の恋人は int と決まってるの!親がそう決めたの!
756720:03/04/25 23:21
int じゃないといかんのですか?
あたしの親も float みたいなかぶいたやつとは付きあわせない
といってました。
floatの有効桁数は6桁
>>754
上は桁落ち、下は情報落ちかな
Real programmers don't use float type.
FORTRANの掟
 先頭1文字目がI,J,K,L,M,N → 整数型 
 先頭1文字目がそれ以外 → 実数型
>>760 今はそうでもないよ
>>761
虚数型は?
764720:03/04/25 23:25
>>759
情報落ちとは?
765デフォルトの名無しさん:03/04/25 23:26
僕もC言語勉強してロマサガ2みたいなすごいゲームをつくります(^O^)/
>>764
>>742の試験に落ちること。

あ、これはマ板のあのスレ向けか。
値の極端に小さい実数同士を演算し、有効桁数を越えた部分が無効とされること

>>738はスルーかいw お前ら勉強してないだろ?
>>767
ぎゃくぽ?
769720:03/04/25 23:32
>>767
おぉ、なんとなく分かるかも。
ありがとうございました。です。
ぎゃくぽのことか?
整数部の大きな数と小数部の大きな数同士で計算した場合の誤差はなんと言うんだっけ。
>>768
Yes、ぎゃくぽ
>>771
桁落ちか、丸め誤差?
>>773
あ、多分後者だ。サンクス。
http://www.i-berry.ne.jp/~kat-sato/fe/H13s/H13s05.htm

この問題ぐらい解けない奴はマジで基本受けとけよ
>>775 上野開設は逆だったのか?よくわからん
情報落ち
 情報落ちとは、大きな値と小さな値を加減算したときに、小さな値が無視されてしまう現象のことです。
コンピュータで扱う浮動小数点では、仮数部に保持できる桁数があらかじめ決められています。そのため、
大きな値と小さな値を加減算すると、有効な数字をもった桁が多くなりすぎるため、正規化する際に
下部の桁が切り捨てられてることになります。
じゃあ>>771が情報落ち?
779デフォルトの名無しさん:03/04/26 00:08
C言語の基礎を学びたいのですが2日ほどで覚えられますか?
○×ゲームくらい作れるようになりたいのですが。
>>779
女の子なら覚えられる
>>778
YES

アスキーやe-wordsのオンライン辞書には載ってないんだな
合格情報処理の付録の辞書にさえ載ってるのに
二次元の配列をmallocで割り当てるにはどうやればいいですか?
○×ゲームの7行ソースきぼんぬ
>>782
//mallcoは確保したメモリの先頭ポインタを返すんだよ。
//つまり、自分でオフセットとって二次元配列の様に扱いなさいってこった。
int head = 3;
int len = 5;
int *arg;

arg = malloc((head * len));
//これでarg[head][len]の様に自分で扱えば良い。
free(arg);
>>784 はヴァカ。
//分ってなさそうだから参考までにforループsample
//0で初期化(ZeroMemory使えって突っ込みはいらない)
int i, j;
for(i = 0; i < head; i++)
{
for(j = 0; j < len; j++)
{
arg[(i * len) + j] = 0;
}
}
//arg[(i * len)][j]だと思え。
787784:03/04/26 03:57
for(;;) printf("ヴァカですか?\n");

while(1) printf("アフォですか?\n");
788山埼渉:03/04/26 04:05
(^^)
789785:03/04/26 04:06
>>784
どうやって多次元配列の各要素にアクセスするのか、その仕組みを勉強しなさい。
790bloom:03/04/26 04:26
791デフォルトの名無しさん:03/04/26 04:58
>>782
>>686あたり
792デフォルトの名無しさん:03/04/26 06:27
int main() {
signed short x=-1;
signed short z;
z = sizeof(x);
if ( x < z ) printf("aaa \n");
else printf("bbb \n");
if ( x < sizeof(x) ) printf("aaa \n");
else printf("bbb \n");

return 0;
}

./a.out
aaa
bbb

どうして、こうなるのですか?またならないようにする
対処方法は?
よく見ていないが、おおかたxがunsignedになって膨大な数になったからだろ。
釣りだろうな。
int main() {
signed short x=-1;
unsigned short y;
signed short z;
z = sizeof(x);
y = sizeof(x);
if ( x < z ) printf("aaa \n");
else printf("bbb \n");
if ( x < y ) printf("aaa \n");
else printf("bbb \n");
if ( x < sizeof(x) ) printf("aaa \n");
else printf("bbb \n");

return 0;
}
./a.out
aaa
aaa
bbb

>>793 無論、釣りですが、説明がつきません。
>>794
signedとunsignedを比較するとsignedの方はunsignedになる。
sizeofが返す型はsize_tだからunsignedでしょ。
796デフォルトの名無しさん:03/04/26 08:42
>>795 では、>>794の下の部分は、どう説明するの?
> unsigned short y;
> if ( x < y ) printf("aaa \n");
#include <stdio.h>
int main() {
signed short x=-1;
if ( x < sizeof(x) ) printf("aaa \n");
else printf("bbb \n");
if ( x < (unsigned short) sizeof(x) ) printf("aaa \n");
else printf("bbb \n");
if ( x < (signed short) sizeof(x) ) printf("aaa \n");
else printf("bbb \n");
if ( x < (signed int) sizeof(x) ) printf("aaa \n");
else printf("bbb \n");
if ( x < (unsigned int) sizeof(x) ) printf("aaa \n");
else printf("bbb \n");
return 0;
}
これやってみりゃわかるだろ?
798デフォルトの名無しさん:03/04/26 11:55
C++を利用してCコンパイラを使う方法がわかりません。誰か教えてください!!
自分で出来たのはvcvars32を自ディレクトリにコピーするところまでです。
>>798
逆ならできるよ、下位互換するシステムなんてそうそうない
800釣られた?:03/04/26 13:40
>798
vcvars32[.bat]はCやC++自体とは何も関係がないだろ。
何で敢えてコマンドラインでやろうとするの?
801デフォルトの名無しさん:03/04/26 14:15
質問です。
srand(time(NULL))で初期化してrand()で乱数を取得したのですが
複数のプログラムを動かすときに、同時に起動してしまうと
rand()がすべて同じ数になってしまいます。
別々の乱数にするにはどうしたらよいのでしょうか。
>>801
時間にプロセスIDを足すとか。
>>801
timeが返す値は秒単位だからね。
システムにもっと細かい精度で時間を得られる関数があればそれを使ったら?
804デフォルトの名無しさん:03/04/26 14:30
>>802-803
ありがとうございます。試してみます。
805デフォルトの名無しさん:03/04/26 15:30
itoa(int,char*,int)
の第一引数と第三引数の意味を教えてください。
標準ライブラリにはそんなものないんだが。
変換対象と基数か?
>>805
   itoa, ltoa, ultoa - 整数の文字列への変換
書式
   #include <stdlib.h>
   char *itoa(int val, char *buf, int radix);
   char *ltoa(long val, char *buf, int radix);
   char *ultoa(unsigned long val, char *buf, int radix);

解説
   itoa(), ltoa(), ultoa()はvalを文字列に変換してbufに格納します。radixには2から36までの整数で変換の基数を指定します。
   itoa()とltoa()はradixが10のときにはvalを符号付き数として扱います。それ以外では符号なし数として扱います。
   ultoa()はvalを符号なし数として扱います。
リターン値
bufに渡された値をそのまま返します。

>>806
> 標準ライブラリにはそんなものないんだが。
↑初耳だ(ワラ
ん?C99には追加されたのか?
http://seclan.dll.jp/c99d/c99d08.htm
http://seclan.dll.jp/c99d/c99d09.htm

C99にもないじゃない・・・・
それとも「標準ライブラリ」という言葉の意味を間違っていたかな?
Cの標準規格で定められたライブラリという意味だと思っていたけど。
キャスト関数は昔から
atoi と勘違いたとか。
812805:03/04/26 15:52
>>807
わお、すばらしい。
ありがとうございます。助かりました。
>>807
また一つ賢くなりましたね(ワラ
確かに数値>文字列の処理はCには無いとの文献も見当たりますね
C99かC++のライブラリに追加されたんじゃないかな?
んで、実装自体はCの関数だから下位互換が可能と。
815>>814:03/04/26 16:04
あ、sprintfは別個ねw <数値文字列変換
816デフォルトの名無しさん:03/04/26 16:35
ANSI-Cの関数の一覧が乗っていたページを忘れてしまったのですが、
アドレスを教えてください。確かピンクっぽい色で、ヘッダごとに見れたと思います。
>>816
希望のところとは違うけど・・・
ttp://www.personal-media.co.jp/book/c/ansi.html
ある意味ブラクラ(謎
818816:03/04/26 17:07
>>817 そのページはなくなってしまったんですか?載せていただいたアドレス
は別にブラクラでは無いですが、希望したページと違いますが、いただきます。
ありがとうございました。
fgetc、fgets、fscanf等で標準入力から入力(リダイレクトなどはしないで、キーボードのまま)するとき、
キーを押してもそのまま入力されるわけではなく、
一度画面上で編集(MSDOSプロムプトなら^Hで1文字削除、NT系ならさらに高度な編集機能)
されてから渡されるのですが、
この入力システムはどこのプログラムが提供しているのですか?
デバイスドライバとかですか?
>>819 FILE *stdin だからデバイスだろうねぇ
821デフォルトの名無しさん:03/04/26 22:42
ヘッダーファイルの#endifとか#ifdefとかって何ですか
>>819
シェルじゃねーかな。
823ろりえおーばーないとせんせーしょんだんさーりこん:03/04/26 22:46
NULLより 0 の方がいい (プロ言§5.1.1)
http://member.nifty.ne.jp/~masumoto/cpp/topic/#RSEC3
マジっすか?
>>823
#define NULL (0)
NULL PO ?
>>819
端末ドライバ。UNIX(SysV)では STREAMS
>>823
バイブルにもそう書いてあるよ。
NULLの方が良かろう。
ポインタだと分かる。
よって否定派。
ぬるぽの内部表現が 0 にならないことがあるっていうのと
混同しているんでは。内部表現がどうあれソース表記上は
0 (NULL)でなければならなかったような。
>>823
そのページみたけど、

>> 有名なC言語FAQ日本語訳 の質問5.17に NULLポインタに 0以外が割り当てられ
>> てる機種があることを知って以来、 "NULL"と表記するように心掛けてきた私にとっ
>> てはセンセーショナルでした。

こいつなんか勘違いしてるんじゃないか?
NULLポインタのビット表現がオール0じゃない機種だろうと、
0("NULL")はNULLポインタなんだが

Stroustrup が 0 と書くのを勧めてるのが事実なら、
単にC++が糞なだけな気がする
831ろりえおーばーないとせんせーしょんだんさーりこん:03/04/26 23:03
NULLの人より0の人が多いみたいですね。
でも、猫ちゃんとかよく見るソースにはNULLが多いですねー。
NULLというものも知っておけということでしょうか。
ありがとうございました。
http://member.nifty.ne.jp/~masumoto/cpp/topic/#SEC4
じゃ↑はどうなんですか?
ポインタと混同しそうなんですが。
>>830
NULLがリテラルの0じゃない処理系があるってことだろ。
だからNULLは定義してあるヘッダーを
インクルードするのが面倒だから
俺は使ってないっていってんだろ! 何言ってんだ!
835ろりえおーばーないとせんせーしょんだんさーりこん:03/04/26 23:05
>>830
C++が糞に見えてくるすばらしい言語を教えてください。
>>835
C言語
837ろりえおーばーないとせんせーしょんだんさーりこん:03/04/26 23:10
>>836
サンクスコ。
古き良き時代。
838デフォルトの名無しさん:03/04/26 23:10
すいません。どなたかちょこっとおしえてください。
.NET Microsoft Framework SDK で、C言語のソースを
コンパイルする方法(コマンド等)を教えてください。
>>833
どういう意味?
#define NULL 0xdeadbeaf
とか0以外になってる処理系があるってこと?
>>839
たとえば(void*)0になってるとか。
>>838 CL, BCC32, CC, JAVACのどれか
>>839
ありえない、絶対にありえない
ふーむ
Stroustrup は、NULL が (void *) 0 になってる処理系があるので、
NULLポインタを使いたいときは、0 を使えっていってるの?
へんなの
アロエリーナ、絶対にアロエリーナ
>>844
「C++は型チェックが厳しいから0を使え」みたいな言い方だったような。
>>844

int *p=(void *)0;

これはコンパイルできるか?
>>847
Cなら出来るんじゃない?キャストしないと気持ちわるいけど
>>848
C++では出来ないから0を使うということで  終わり。
void* をキャストなしで他のポインタに代入できない仕様になった時点で
NULL の定義も 0 とするように決めておけば良かったのにな。
NULLテンプレートにすればよかった
>>850,>>851
どうやったところで、ヘッダのインクルードが要るなら現状と同じ。
NULLをキーワードにしちゃえよ
ヘッダのインクルードにやたらとこだわっている人がいるな(w
855デフォルトの名無しさん:03/04/27 00:11
>>841
さん、ありがと。
cl コマンドででできました。

856841:03/04/27 00:14
JAVACにツッコミが来なかった・・・もう来ない・・・
857ろりえおーばーないとせんせーしょんだんさーりこん:03/04/27 00:29
僕の心は揺れています。
1/f
VC++5or6中古買いたいんだが、ヤフーオークションめんどくさい
だれかお助けを!


>>858
お前のタイーホの共犯になれとでも?断る。
>>858
もう一度よく考えるのです。
ほんとうにVC++が必要なのか。
861デフォルトの名無しさん:03/04/27 01:28
include<stdio.h>
void main(void)
{
int fuck;
fuck=0;
printf("%d"fuck);
}
862デフォルトの名無しさん:03/04/27 01:32
あのさ、CでGUI作れるの?
何かの本でC++はCの進化系だと書いてあったんだけど。
それとC++ってわざと難しく創られたって本当?
多分多くの処理系で
#ifdef _cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
と定義されていると思うけど。
MS-DOS時代でもGUIとかマルチタスクはあったんだよ
865デフォルトの名無しさん:03/04/27 02:13
そうだったんですか・・・
>>863
(void *) 0 使ってるのってどの処理系?
普通は、#define NULL 0 でしょ?

ちなみに Solaris8 では、こんなんだった

#ifndef NULL
#if defined(_LP64) && !defined(__cplusplus)
#define NULL 0L
#else
#define NULL 0
#endif
#endif
>>864
一太郎?
868スレッド直リン:03/04/27 02:46
>>866
gcc,VC++6.0
>>866
VC++ とかだろ

[VC++6 の stdio.h]
/* Define NULL pointer value */

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
870868:03/04/27 02:47
あー名前が・・・・
871ろりえおーばーないとせんせーしょんだんさーりこん:03/04/27 04:06
#define NULL ((void *)0)
define って、キャストしない場合は int なんでつか?
プリプロセッサ命令に型などない。
>>871
define はキャスト出来ません。
874デフォルトの名無しさん:03/04/27 04:22
C初心者、勉強中です
BCC5.5を BCC Developer(フリー)で使っているのですが・・。
このBcc Developerについて
何処か良い説明載ってるトコご存知ない?
>>871
int define;と定義すればintだし、char *defineと定義すればchar *
876デフォルトの名無しさん:03/04/27 04:29
なぜNULLを予約語にしませんか?
>>876
大文字だから
878877:03/04/27 04:43
× 大文字
○ 全部大文字
>826
てことは、fgetc等でのキーボードからの入力では、履歴機能や挿入入力とかは((システム側に)用意されてなかったら)使えないのですね。
>>879
履歴とか使いたかったら、gnu getline使え。
OSで持っている訳ではない。
但しこれはLGPLではなくGPLなので、プログラム全体が
GPLに矛盾しないライセンスになるので注意。
似たようなライブラリで、BSDライセンスのも有るが、俺は使った事無い。
>880
それは違う
882デフォルトの名無しさん:03/04/27 11:23
hです。
制すうちを入力しshort型の変数に格納した後
この変数の内部表現をビット列で表示するプログラムを作成せよ・・・
という課題がでました。

integer=>1
0000000000000001
integer=>-2
1111111111111110

といった感じで表示するってとこまでは分かったけど・・・
実際のプログラムが分かりません。助けてください・・・。
>>882
宿題スレへ。
http://pc2.2ch.net/test/read.cgi/tech/1045074808/l50
なんか、最近何度も見た気がするのは気のせいだろうか…
>>883
> なんか、最近何度も見た気がするのは気のせいだろうか…

同じ学校とかじゃねーのかな ?
885デフォルトの名無しさん:03/04/27 11:52
scanf()って基本的に使わないんですか?
??=とかの3連文字はちゃんと習得しておいた方がいいのでしょうか?
887デフォルトの名無しさん:03/04/27 13:16
どなたか教えてください。
C言語の本で、実際に実用に使えるような完結したソース
を扱っているC言語応用編みたいないい本はないでしょうか。
練習用の小さなソースだけでは力がつかないような気がしたので、
どなたかちょこっと教えてください。
>>887
作ってわかるC言語 日下部陽一・著
889デフォルトの名無しさん:03/04/27 13:26
Cをやっているのですが、どんなプログラムが書ければ
脱初心者になれるのですか?おながいします。
>>889
そんな質問をしなくなれば、脱初心者だ。
891デフォルトの名無しさん:03/04/27 13:48
行列の要素が何個あるかを調べる関数はありますか?
>>891作れ
893891:03/04/27 14:34
>>892
ありがとう。やってみます。
894891:03/04/27 14:36
あ、まちがえました。
行列じゃなくて、配列でした。
ありますか?
>>894
#define yousosuuhaikutsudesuka(array) (sizeof array/sizeof array[0])
適当に括弧を付けて。
896891:03/04/27 14:59
>>895
ありがとうございました。たすかります^^
897489:03/04/27 15:22
約、一週間が過ぎようといていますが、合計値を横に出すことが出来ても
どうしても、すべて1と表示されてしまいます。ちょっと混乱して分かりません。
どなたか力を貸していただけないでしょうか?よろしくお願いいたします。
初心者ですみません。
fflush(stdin)には誰も突っ込まないんだな。
899デフォルトの名無しさん:03/04/27 16:13
すいません、ちょっと質問したいんですけど、VCで
インクルードファイルがオープンできませんってエラーが
出るんですけど、このときの設定はどうすればいいんですか?
コンパイラのインストール時の設定を見直す。
>>899
どこにあるなんというインクルードファイルがオープンできないのか判らないと
詳しいことは回答できないと思われ。

ついでに言えば激しくスレ違い。
>>897

#define MAX_ROWS 5
#define MAX_COLS 10
#include <stdio.h>

int main()
{
int table[MAX_ROWS][MAX_COLS];
int i,j,k;
int total;

for(i=1; i<=MAX_COLS; i++){
  for(j=1; j<=MAX_ROWS; j++)
    printf("%3d",j+MAX_ROWS*(i-1));

    total=0;

    for(k=0; k<MAX_ROWS; k++)
      total+=MAX_ROWS*(i-1)+1+k;

    printf("%4d\n",total);

}

return 0;
}
903902:03/04/27 16:39
インデントの入れ方が良くなかったかな。

#define MAX_ROWS 5
#define MAX_COLS 10
#include <stdio.h>

int main()
{
int table[MAX_ROWS][MAX_COLS];
int i,j,k;
int total;

for(i=1; i<=MAX_COLS; i++){
  for(j=1; j<=MAX_ROWS; j++)
    printf("%3d",j+MAX_ROWS*(i-1));

  total=0;

  for(k=0; k<MAX_ROWS; k++)
    total+=MAX_ROWS*(i-1)+1+k;

  printf("%4d\n",total);

}

return 0;
}
int table[MAX_COLS][MAX_ROWS];
ではいかんのか?
905902:03/04/27 16:55
コピペ→編集 してたから気づかなかったけど、

int table[MAX_ROWS][MAX_COLS];

は要らなかったな。
>>489 >>897 配列になぜいれるのかが分かりません。その機能を別の所
で使うのだと思うのですが。表示するだけなら↓。
#include <stdio.h>
#define PURASU 5
#define IKOHRU 10
int main(void)
{
int y,x;
for(y=0;y<IKOHRU;y++)
{
for(x=1;x<=PURASU;x++)printf("%5d",PURASU*y+x);
printf("%5d\n",(PURASU+1)*PURASU*10/20+PURASU*PURASU*y);
}
getchar();return 0;
}
>>886
欧州の方で、Cプログラマになるなら必要かもしれない。
908デフォルトの名無しさん:03/04/27 20:20
red hat linuxですがgetche()を使うためのヘッダファイルがわかりません
お願いします
>>908
curses.h
getchだけど多分同じだと思う。
>>908
getche()なんてものがあるのかw

getc, getch, getchar・・・もう分け分らん
>>908
man で調べてみれば?
>>909
ありがとうございます
コニ男さんでgetcheが使えるみたい
(^O^*)
Curses版、getch()w/echoだったっけ?<getche()
エコーバックのある getch() と覚えておけ
じゃあそのげっちぇのeはechoのe?
げっちぇ言うな
げっち、げっちぇ、げっちゃら
>red hat linuxですがgetche()を使うためのヘッダファイルがわかりません

こーゆー質問を見ると、知りたいのは本当にヘッダファイルだろうか
という疑念がわかないでもない
921デフォルトの名無しさん:03/04/28 03:27
主に使うのはVC6とmingwなんですが、
memcpyと自分でforループ回すのって
一般的にどっちが速いんですか?
memcpy
923デフォルトの名無しさん:03/04/28 03:54
>>922
ありがとうございました。
アセンブラの出力見て多分そうだと思ってましたが、
やっぱりそうですよね。
924デフォルトの名無しさん:03/04/28 03:55
俺もmemcpyに一票つーか、何でforループの方が早いかもとか、思うのかが不思議。
同じことをするライブラリ関数に手書きコードが勝てること等ないと思った方がいい。
スピードなら俺の書いたqsortの方がVC++6.0のqsortより速い。
>925
で、代表値はどうやって選んでるの?
代表値ってなんだろ・・・・基準値なら真ん中。
再帰使っているから使い物にならないけどね。
うーん、間違って覚えてたみたい。
真ん中って、配列上の真ん中に位置する値ってことですか。

qsort の弱点克服の方法はないのかのー。
コードの冗長性&コストの無駄遣いならライブラリには負けない自信がある。
>>929
なにー!
それなら漏れも負けんぞぉ!
読みやすさなら勝てるかもー?
>>931
逆に最近チマチマしたチューンナップってやっちゃダメだと
分かっちゃいるけど、たまに書いてみたくなるよ。
933デフォルトの名無しさん:03/04/28 06:07
Java->C
Python->C

組み込むならどっち?
Pythonで実現可能ならそっち選んだ方がいいかな?
また意味不明・・。
その矢印が表すものは何だ?

(*Java).C
(*Python).C
>>935 Thx! 分かりやすくなったよ
937デフォルトの名無しさん:03/04/28 15:34
たとえば
fread(data,2,100,fp);
は,配列data中に,2バイトずつ100個のデータを,fpから読み出す、
という意味になるかと思います。これを100個ではなくてfpの
最初から最後までという指定方法を教えてください。
>>937
fseek(fp,0,SEEK_END);
size = ftell(fp);
fseek(fp,0,SEEK_SET);
fread(data,size,1,fp);
(fp の最初ってファイルの最初なのかどうか分からないけど、)
答え出しちゃうと面白くないと思うからヒント
fp の最初にとるべき位置と最後の位置を分からないと配列の長さが確定しない。

ファイル先頭から見て fp の現在位置を知る方法や、最後に移動する方法、
もしくはファイルサイズを得る方法が分かると、自ずからわかるんじゃない?
940939:03/04/28 15:41
。゚(゚´Д`゚)゚。デヲクレタ
>>940
うまい棒でも食べて元気出せ
942デフォルトの名無しさん:03/04/28 15:55
a = 30 + (0x15aa >> m & 1);

これはどういうことですか?

mは適当な整数ということでよろしくおねがいします。
ぱっと見、月の最後の日付をとりたいのかなぁ、と思った。
2 月が例外になりそうな気もするけど。
944942:03/04/28 16:05
>>943
2月は別に作ってあるので大丈夫なんですが、

0x15aa >> m & 1 の意味がわかりません
うーん。机上でトレースしてわかってくれ。
0x15aa は二進では 1010110101010だよな。
m = 3だと、0x15aa >> 3 は、1010110101になる。 &1で、1。
m = 4だと、0x15aa >> 4 は、101011010になる。 &1で、0。
m = 5だと、0x15aa >> 5 は、10101101になる。 &1で、1。
947945:03/04/28 16:13
>>946
トレースまでしてあげる貴方を優しいとオモタ。
>>942
mが偶数なら5576をaに入れる。
mが奇数なら2803をaに入れる。
>>948
950948:03/04/28 16:20
おっと、>>の方が&より高いわ。
どうりで変な値になるわけだ。
どうでもいいけど、素直にテーブル使ったほうが速いよな。
>951 まぁ、そうなんですが、そのへんはツッコまないのがよろしいかと。
どうでもいいことだが、 & はむちゃくちゃ優先順位低いよ。
a & 0x01 == 0x01 は
a & ( 0x01 == 0x01 ) と等価。

954942:03/04/28 16:35
>>943->>953
(・∀・)サンクス
>953
それって、確か昔&&を&で代用していたころの名残なんだよね。
>955 (´・∀・`)ヘー ナルホドウ
>953 さんではないけど、それは知らなかった。
>>944
> 2月は別に作ってあるので大丈夫なんですが、

28 + (0x3bbeecc >> 2 * m & 3) ってやれば、2月を別扱いしなくて済むぞ。
年を知らずに2月の日数を得ることは出来ない。
dayOf2 = 28 + (year % 4 == 0)
ただし、year > 1900 && year < 2100
>956
ホントはもっと順位を上げるべきだったのだがその時点で既に大量のソースが
あったので今更変更する(ことでどれだけの修正が発生するかと思うと)勇気がなかった。

とかなんとか、そんな理由だったかと。
>>957 >>959
お前ら2000年問題からなにも学ばなかったのか?
>>961
2000年問題は、うるう年が問題ではないことも知らないのか?
>>959
2000で例外が発生しないか?
964963:03/04/28 17:11
あほでした。
400で割り切れる年は閏年でした
いつものパターンですな。>>963 氏が潔いことを除けば。
>>962
条件つけてまでくだらん式を考えてないで
普通にちゃんとした式を出せばいいだろ。
どうせ今の西暦(グレゴリオ暦)が採用される前のデータなんか扱うわけないし、
2100年以降のデータも扱わないって言うなら100年400年ルールは考える必要がない。
そのくらいの割りきりも時には必要。
そう。そうやってどうせ使わないだろうという甘い考えからy2kの悲劇が起こった。
対応するのに膨大な手間がかかるのならまだしも、
すぐ近くにマトモな答えがあるのに、それを使わない理由など無い。
計算式を逆ポーランド記法に変換するアルゴリズムの方針だけでも教えてよ

1 + 2 * 3 → 1 2 3 * +
stack , pop , tokenとかの関数は作ったからあとは変換するだけなんだけど
よくわからんぽ
>>969
宿題スレへどうぞ。
http://pc2.2ch.net/test/read.cgi/tech/1045074808/l50

>>968
そろそろスレ違いだけど、
年のフィールドに数字が2桁しか入らないデータ構造って話と
2100年以降のデータは扱えないプログラムって話を
同列に語って意味があるとでも?
そもそも2100年以前に32bit限界(2038年問題)が発生するってば。
> 年のフィールドに数字が2桁しか入らないデータ構造って話と
> 2100年以降のデータは扱えないプログラムって話を
> 同列に語って意味があるとでも?
意味あるだろ。どちらも甘い考えが引き起こした。
先読みの甘さ。うるう年の計算をまともに実装しない甘さ。

> そもそも2100年以前に32bit限界(2038年問題)が発生するってば。
この場合のyearはint型だろ。話が違う。
972デフォルトの名無しさん:03/04/28 18:32
C言語勉強してるんですが、
1Uって書くのと1と書くのではどう違うんですか?
符号無し。
まず、1U とか 1 って何型か考えてくれ。
975デフォルトの名無しさん:03/04/28 18:41
期待age
976972:03/04/28 18:44
>>974
intでよろしいですか
977デフォルトの名無しさん:03/04/28 18:45
>>976
1はな
978972:03/04/28 18:46
>>977
1Uはunsigned intってことですか?
979974:03/04/28 18:47
int:16bit 長のシステムがあったとしよう。

君は long (4バイト長)な変数 l に値 8000h を入れたいと思っている。
さぁ、どう書くの?
その時に気を付けなければならないことは?
>>979
Lをつけると思うけど!?
981974:03/04/28 18:50
ウワーン!
例えば無しを間違えちゃ話になりませんなぁ。ゴメン!

int main() { return ( -1 < 1 ); }
int main() { return ( -1 < 1U ); }

それぞれどっちが返るか見てみたら?
>>974
値のコンペアをする場合に問題あるんだろ?
984972:03/04/28 18:55
う〜ん、符号ビットの話かな
すみません
ちょっと用事で20分くらい離れます
1 < 0x80000000 と 1 < 0x80000000U の比較結果
次スレは…なしで!(w
987974:03/04/28 18:57
ヘコんだ。
988972:03/04/28 19:20
>>982
上は1,
下は0でした。

>>985
両方1でした。
989937:03/04/28 19:27
>>938,939
できました。
ありがとうございますた。
>>961-968
お前等未だに 2000年問題とか言ってるのか ?
学習効果なさ杉。
これでも読んどけ → http://www8.ocn.ne.jp/~yama-b/rfc2550j.txt
ume
tate
1000を撮ります宣言!
1000を取りま1000 1000言!
yoko
1024?
65535
まあ俺が1000なんだけどな。
1000撮った
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。