C言語なら、俺に聞け! <16>

このエントリーをはてなブックマークに追加
漏れは38才、21年間プログラムを一生懸命作ってきた。
いろいろな言語を極めたが、一番手になじむのはCだった。
Cのことならぜんてわかるから、疑問な点があったら漏れに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・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/yfcbookshelf-22/250-3950205-1475419

K&Rで挫折するような救いがたいやつはこれでも読め
・作ってわかるCプログラミング(アヒル本と呼べば通だ)
http://dennou.gihyo.co.jp/books/void_c/
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/249-4698746-2014711

推薦図書/必読書のためのスレッド PART2
http://pc.2ch.net/test/read.cgi/tech/1010312992/l50

・前スレ C言語なら、俺に聞け! <15>
http://pc.2ch.net/test/read.cgi/tech/1016519243/l50
2デフォルトの名無しさん:02/04/11 00:48
2
delete this;
長い。
>>1 は本物の日下部。
6緑茶。 p0086-ip01kagawa.kagawa.ocn.ne.jp:02/04/11 00:51
うんこ
( ´д`)=○)'β') ←>>6
8緑茶。 p0086-ip01kagawa.kagawa.ocn.ne.jp:02/04/11 00:57
しょうもないことで
いちいちぴりぴりしてちゃ
この先生きていけんぞ
どの先生がなんだって?アフォ
10緑茶。 p0086-ip01kagawa.kagawa.ocn.ne.jp:02/04/11 01:01
あぁ、世知辛い世の中
香川県のOCNに通報しました。
12デフォルトの名無しさん:02/04/11 02:19
system("age");
13デフォルトの名無しさん:02/04/11 07:47

pid=fork();
if(pid==0)
execl("age","age",NULL);
else
wait(pid);
...?
>>13
いや、子プロセス作るのは勝手だけどさ・・・。

ファイル file.in をプログラム prog に読みこませ、
ファイル file.out に出力したいんですが。
つまり次のような感じです。

$./prog < file.in > file.out

で、次のようなプログラムを書きました。

#include <stdio.h>

int main(void){

    FILE *fpin, *fpout, *fpprog;

    int c;

    fpin = fopen("file.in", "r");
    fpout = freopen("file.out", "w", stdout);
    fpprog = popen("./prog", "w");

    while((c = fgetc(fpin)) != EOF){
        fputc(c, fpprog);
    }

    fclose(fpin);
    fclose(fpout);
    pclose(fpprog);

    return 0;
}

プログラム prog は標準入出力を使う前堤で作ってます。
一応目的は達成できてるんですが、何か ダサダサ な気がするので、
もうちょっとスマートなやり方はないでしょうか ?
15はホントに「標準入出力」の意味をわかっているのかと、
ついでに、そのfpprogは一体なんだと、小一時間(略)
>>16
く、先を越された。激しく同意!
1815:02/04/11 09:43
>>16
>>17
小一時間問い詰めて下さい。
激しくキボンヌ。
>>18
まず、
$rm file.out
$./prog
$ls file.out

実行。

・・・っていうかそれ正常に動くのか????
思いっきり自分自身を書き変えようとしてるが・・・。
>>15
while(scanf("%c",&a) != EOF)
printf("%c",a);
>>20
getchの方がいいね。
>>15
標準入出力のFILE構造体へのポインタはstdin、stdoutだろ。
わざわざfopenする必要はない。
2315:02/04/11 10:16
>>19
一回出力ファイル(file.out)消してやってみましたが、
やっぱりちゃんと作られます。

実際のコードと書き込んだコードが違わないか
今から確認してみます。

>>21
linux 使ってますが、getch は無いような・・・。
>>15
「標準入出力を使って動作するプログラムがすでにあったとして、こいつに特定の
ファイルを食わせて特定のファイルに吐き出させるプログラムを作りたい」ってこと
だよね?
system("./prog < file.in > file.out") が一番スマートな気がするけど…
2515:02/04/11 10:30

>>22
> 標準入出力のFILE構造体へのポインタはstdin、stdoutだろ。
わかります。

> わざわざfopenする必要はない。
これもわかります。

ですが、
> 15に対して、
> 標準入出力のFILE構造体へのポインタはstdin、stdoutだろ。
> わざわざfopenする必要はない。
こうなるとわからない。

>>15 のどこかで stdin, stdout を開いているということですか?
それとも内部的にそうなるとか、そういうことでしょうか?
標準ライブラリが main()を呼ぶ前に stdin, stdout, stderrを開いている
(内部的にfopenを同等の動作)

で、通常はstdin, stdout, stderrはわざわざ閉じる必要はない。

とりあえずそういうもんだと思え。
2715:02/04/11 10:55

>>24
> 「標準入出力を使って動作するプログラムがすでにあったとして、こいつに特定の
> ファイルを食わせて特定のファイルに吐き出させるプログラムを作りたい」ってこと
> だよね?
そのとおりです。
そしてそう書いたつもりだったんですが、15 の説明がわかりにくかったようです。
考えすぎました。

> system("./prog < file.in > file.out") が一番スマートな気がするけど…
確かにそうです。納得。system() を調べてみます。

実際には入力ファイルも出力ファイルも複数あるので、
ファイル名が固定だと後で困りそうです。


>>19
コードは間違っていないようです。
2815:02/04/11 11:08

>>26
> 標準ライブラリが main()を呼ぶ前に stdin, stdout, stderrを開いている
> (内部的にfopenを同等の動作)
わかります。

> 通常はstdin, stdout, stderrはわざわざ閉じる必要はない。
この文自体もわかります。

ですが、「15 のコードに対して言う」ところがわからない。
15 のコードのどこかで stdin, stdout, stderr のどれかを閉じているということでしょうか?
または結果的にそういうことになっている、と言うことでしょうか?

なにか話が噛み合っていない気が・・・むぅ。
>>1はvoidたんに戻ったのか。
30デフォルトの名無しさん:02/04/11 11:26
>>27
sprintf(cmd, "%s < %s > %s", prog, file_in, file_out);
system(cmd);
>>28
お前のアフォさ加減にかなりゲンナリだが… それとも新手の荒らしか?(藁

入力するファイルと出力するファイルをリダイレクトしてる
わけだからソース中ではファイルのオープンをせずに
標準入出力のライブラリ関数を使えばいいだけだろう。
printfでもgetcでも好きなの使え。
3224:02/04/11 11:32
>>28
> 15 のコードのどこかで stdin, stdout, stderr のどれかを閉じているということでしょうか?
> または結果的にそういうことになっている、と言うことでしょうか?

freopenしたときに元のストリームは閉じられる…けど、そういうことじゃないな。

progの話とprogを呼び出すプログラムの話が混ざっているから混乱すると思われ。
>>15で書いたコードは「progを呼び出すプログラム」のものだけど、説明が悪いので
progのコードだと誤解しちゃっている人がいるんだと思う。
>>32
なんだそういうことか… 笑うしかないな(藁
プログラムを組む上で最も大切なものは、論理的な思考 | 正確な日本語 だと思います。
>>34
&じゃなくて|を使うところがプログラマらしくてよろしい。
>>35
&&じゃだめ?
37デフォルトの名無しさん:02/04/11 12:56
文字列をC言語の式として評価して
値を求めるコードを書きたいのですが、どうしたらいいでしょうか?

例>
char tmp[]="12>=24 && 23*5>4*29";
tmpをある関数に渡すと、FALSEが返る。
>>34-35
論理的な思考ができれば、正確な日本語は必要ないってことか・・・
>>37
そいつあ、難しい。
なんかのインタプリタから、式評価関数をパクってきたほが
早いかも。
int c;
while(c=getchar(),c != EOF)
putchar(c);
>>38
|| じゃなくて | です。1からやり直しましょう。
>>37
まず数字と演算子に分解。
#if 式を後で使うかも(インタプリタ作るとか)
演算子の優先順位を基準にツリー化(低い=ルートより、高い先っぽ)
ツリーの先っぽから計算
#else
優先順位の高い演算子から逐次計算・置き換えしていく
#endif

後者ならちょちょっとできるよ。
ただC言語の式=関数呼び出しも含める、だとちょと無理。
43デフォルトの名無しさん:02/04/11 13:25
Linuxのmcontext_t構造体が
/usr/include/sys/ucontext.hにおいて宣言されています。
そのメンバとしてレジスタ退避用のint[19]を確保しています。

配列の要素にレジスタを割り当てるために、
無名列挙体のオートナンバリング機能を使って
enum {
 REG_GS = 0,
#define REG_GS REG_GS
 REG_FS,
#define REG_FS REG_FS
 REG_ES,
#define REG_ES REG_ES
・・・
};
としているのですが、ここで疑問があります。(前置き長くてスマソ)

宣言したすぐそばから#undefしてしまっているように見えるのですが
これはどうしてなんでしょうか?
44ネタ:02/04/11 13:28
>>37
対象システムでgccが使えるなら。

#define TEMPSOURCE "/tmp/eval_tmp.c"
#define TEMPOBJECT "/tmp/eval_tmp"
int evaluate(const char *exp) {
FILE *fp;
fp = fopen(TEMPSOURCE, "w");
fprintf(fp, "int main() {return (int)(%s);}", exp);
fclose(fp);
system("gcc -o " TEMPOBJECT " " TEMPSOURCE);
return system(TEMPOBJECT);
}
4515:02/04/11 14:01

>>30
> sprintf(cmd, "%s < %s > %s", prog, file_in, file_out);
> system(cmd);
むぅ、これはいいですね。早速使ってみます。


>>31
あなたがどれ程できるのか私には サパーリ わかりませんが、
私にもあなたが何が言いたいのかさっぱりわかりません。

アフォ からの忠告ですが、理解できない相手を非難するより、
どうすれば相手に理解してもらえるのかを考えた方が
ご自身の能力は高まると思いますよ。


>>32
freopen で stdout を閉じてるのはわかっていますが、
閉じる必要はないなどと書いてあったので私としては ハァ? な状態になってしまいました。
閉じて繋ぎ直さなきゃ、どうすればいいのかと。

> progの話とprogを呼び出すプログラムの話が混ざっているから混乱すると思われ。
> >>15で書いたコードは「progを呼び出すプログラム」のものだけど、説明が悪いので
> progのコードだと誤解しちゃっている人がいるんだと思う。

なるほど、>>31>>15 で何が書いてあるかわかっていなかったと。
噛み合わないはずですね。
説明は確かに自分で読んでも分かりにくいです。
日本語勉強し直します。

勉強になりました。 >> ALL

43です。寝ぼけてました。なかったことにして下さい。
4738:02/04/11 14:37
>>41
やり直してきます&0
48デフォルトの名無しさん:02/04/11 18:24
a
ab
abc
abcd

↑のようにzまでにコンソールに出力したいんですができません
誰か助けて〜
4931:02/04/11 18:27
>>45
スマソスマソ。こっちの誤解だった。でもまあ、>>31の下の文章の日本語は
わかりにくいか?この例の話の筋とは違うが。
>>48
ん?
5148:02/04/11 18:35
ほんとお願いしますよ〜
できないと明日先生に怒られるんですよ〜
配列を使えと言われたんですが私にはわかんなかったです
>>51
宿題は自分でやろぉね。
5448:02/04/11 18:52
わかった。
無知な人に聞いても無駄だよね。ごめんね
無知な人は聞いても無駄だよね。ごめんね
48は荒らし
char ch, str[30];
char *p = str;
for( ch = 'a'; ch <= 'z'; ch++){
 p[0] = ch, p[1]='\0';p++;
 printf("%s\n", str );
}
>>57
もっとも、このソースを見ても理解不能という >>48 に誂え向きの罠。
5957:02/04/11 20:17
>58
しまった。その観点から言えば、wide系の関数を使えばよかった(笑)
#include <stdio.h>

void main(int n)
{
    int c = 'a';
    static int e = 'z';
    if (n == 1){
        main(e);
    }else if(n >= c){
        main(--e);
        while(c <= n){
            putchar(c++);
        }
        putchar('\n');
    }
}
wide系の関数って何?
wchar_t ch, str[30];
wchar_t *p = str;
for( ch = L'a'; ch <= L'z'; ch++){
 p[0] = ch, p[1] = L'\0'; p++;
 wprintf(L"%s\n", str );
}
って事。
あんま遊ぶなよ(;´ー`)

#include <stdio.h>

void main(int ch)
{
while( putchar( '`'+ch++ )!='z' );
}
A=-5;

としますよね。

このAがマイナスだということを判定(判別)するにはどうしたらいいんでしょうか?
65デフォルトの名無しさん:02/04/11 22:43
ここの人ってなんでこんなにレベル低いの?
if
もしもしー?
6864:02/04/11 22:51
ごめん、わかった。
if(a > 0)
だね

なんか特別な関数いるのかと思った
>>68
アフォですか?
7068:02/04/11 22:53
  ∧ ∧
  (  ,,) ・・・
  ./  |
 (___ノ



  ∧ ∧
  (´ー`) ・・・・
  ./  |
 (___ノ
ネタになると思ってるところが、アフォですね。
7266:02/04/11 22:56
もしかして俺はネタに吊られたのか?
7368:02/04/11 22:56
今暇なんよ。
俺と一緒にうだうだしようZE!(o^-')b 
       /_________ヽ  | ΛΛマジ?
                 ガラッ!!||    三 || ̄ ̄ ̄ ||   |(;゚Д゚)
                     || エーッ!三||    / ||    |'と |⌒)
    ΛΛナニッ!?          || ΛΛΞ||  // ||   || | ノ
   (;゚Д゚)ミ            || (;゚Д゚) ||//   ||    |ι ' ~
⊆ ̄ιノυ            ||ι   ⊃||/     ||   |
 ̄ ̄| ̄ ̄| ̄|           || | | ||___ ||    |
 ̄| ̄ ̄| ̄ ̄|ΛΛホントカヨ… | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|   ____
 ̄ ̄| ̄ ̄| ̄|;゚Д゚)        ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  /\____
 ̄| ̄ ̄| ̄ ̄| /U   ズボッ!ΛΛウッソーン!?     /ΛΛ\___
 ̄ ̄| ̄ ̄| ̄| |      || (;゚Д゚) ||            |(;゚Д゚) |  ̄ ̄
 ̄| ̄ ̄| ̄ ̄|∪       ||ヾ||,,'||       п。。。|゚ι、| |オイオイ…!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ほんとばかばっか。
7748:02/04/11 23:38
ごめんなさいできました

char s[30];
int i;
for(i = 0;i < 26;i++){
s[i] = 'a'+i;
s[i+1] = '\0';
puts(s);
}
7848:02/04/12 00:03
アハハ>>57よりましかな。
>>78
そお?
48はネタだった、に5票。
8163:02/04/12 00:17
じゃぁ漏れは問題の意味を間違ってた漏れはアフォだった、に1票入れておくよ(;´ー`)
8248:02/04/12 00:19
>>80俺も一票。
>>82
邪魔。帰れ。
84デフォルトの名無しさん:02/04/12 06:08
#else if
みたいなことってできないですか?

今は
#if defined(__XXX__)
 ・・・
#endif
#if defined(__YYY__)
 ・・・
#endif
みたいな感じにやっているんですが、なんかかっこ悪いです。
#elif
>>85
ありがとうござます。
お礼にフェラさせて下さい!
食っちゃーはぴはぴハイチュー
>>86 きもい
88デフォルトの名無しさん:02/04/12 07:37
Cの言語仕様(名前空間とか構文形式とか)を調べたいんだけど、
良いサイトor本ある? サイトを検索してみてyaccの構文規則
なら見つけたんだが、解説がないと意味わからんわ。

なるべく新しいのでおながいします。
>>88
K&Rじゃだめなん?
>>88
gccのドキュメント
gccのサイト経由で使えそうな文書見つかりました。
ありがと>>89-90
>>88
yacc の構文規則、なのか?
BNF 見れ。
BMP画像を右か左に90度回転させて表示ってのができません。
メモリとってグラフィックデータを回転後の位置で並べ替えてコピーし表示、
こういう流れでやりたいのですが、どこをどうすればいいやら・・・

何か助言お願いします
94デフォルトの名無しさん:02/04/12 16:46
>>93
がんばれ!
助言終わり。
>>94
あふん
でもありがとう
96デフォルトの名無しさん:02/04/12 16:49
dest[x][y] = src[y][width-x-1]
いじょ。
96さんのをちょい改良したらできました。ありがとう!!
いや論理はできたんですが型がわからず挫折。
destとsrcの型って何なんでしょうか?
>>98
たぶん君はここでヒントもらって何とかなるってレベルじゃないと思うよ。
まるまるコードを書いてくれる親切な人をがんばってさがすしかないと思う。
>>93
http://www.sm.rim.or.jp/~shishido/dib1.html
まぁ、このへんからコツコツと。
>>98
まぁ、一応教えてあげると、
色深度が24〜31ビットなら、unsigned longだね。
同じく16bitならunsigned short、256色ならunsigned charでまにあう。
もちょっとスマートにするなら、構造体を定義するか、定義されてる
もの(Colorとかなかったけ?)を使おう。
> destとsrcの型って何なんでしょうか?

とか聞いてるのがすごく心配だ・・・
その式は座標の変換を表してるだけでそのままじゃ使えないぞ?
103age:02/04/12 23:15
⊂(`Д´⊂ )⊃== あげちゃうぞフォルァ!
104ポインタで…:02/04/13 00:01
#include <stdio.h>

int main(void){
char temp[32][32];

scanf("%s", temp[0]);
printf("%s",*temp[0]);
return 0;
}

いろいろ考えてみたけど、scanf,printfの引数がどれが合っているかさっぱりわからん。
temp[0]="abc",temp[1]="bcd" という配列を出力したいんですが…どうすればよいですか?
二重配列について詳しく教えてください(涙)
105デフォルトの名無しさん:02/04/13 00:04
Windows2000でエスケープシーケンス使えないらしいけど、
DOSで位置を指定して文字を出力させたい場合どうすればいいですか?

過去のスレ探したけど同じ内容が見当たらなかったのでお願いします
106デフォルトの名無しさん:02/04/13 00:07
>>104
*temp[0]はtemp[0][0]と同じ意味になるので注意。(char型を指す)
scanfの引数としてtemp[0]、&temp[0]どちらでもいい。普通は&を省略。
temp[1]にbcdを読み込ませる事。
temp     →     temp+1 
 ↓             ↓
  |1|2|3|4| .. |29|30|31|32|
108デフォルトの名無しさん:02/04/13 00:12
>>105
なぜwin2000でDOS(コマンドプロンプトってことだよね?)使うの?
そんな非効率なことさっさと辞めて、rubyでも覚えたほうがいいよ。
109ポインタで…:02/04/13 00:13
>>106
よく考えたら*temp[0]はtemp[0][0]と同じ意味ですね。
temp[0]にしたらうまく動きました。

でもscanfでtemp[0]と&temp[0]が同じ意味になるのはなぜですか?
&がつくとアドレスを得られるから、アドレスのアドレスという不可解な意味に
なってしまう気がするのですが…。
>>104
日本語喋ってくれ
111105:02/04/13 00:22
>>108
いや、超初心者にCを教える環境がWindows2000なんだよ。

だから、非効率でも良いから教えてください。お願いします。
char temp[32];
&temp;
(char**)temp;
互換性
113ポインタで…:02/04/13 00:24
>>110
日本語頑張ります。
char temp[32][32];
という二重配列を宣言して、temp[0]="abc", temp[1]="bcd", … みたいに文字列を代入しました。
strcpyみたいなchar *型を引数として要求される関数を使用するとき、引数の指定の方法が
分からなかったのです。(*temp[0]とか、**tempとか)
…意味わかりますか?説明不足でごめんなさい。
> temp[0]="abc", temp[1]="bcd", … みたいに文字列を代入しました。

できたのかよ!(三村流
115デフォルトの名無しさん:02/04/13 00:32
>>111

> 具体的に申しますと、VC++6.0で
> printf("\x1b[31m文字の色は赤\n")
> という内容のCソース作成し実行すると、
> Window98では文字の色が赤くのなるのですが、
> Windows2000では文字の色は変化しませんでした。
> そこでWindowsNTの過去ログを参照したところ、
> "device=%SystemRoot%\system32\ANSI.SYS"
> をCONFIG.NTに追加すると、エスケープシーケンスが使える
> とあったので、試しましたがやはり何の変化もありませんでした。
私のWWWの検索エンジンで調べた限り

・そもそも Windows2000 では対応していないという記述が散見される。
ANSI.SYS も有効でないという記述も見られました。
# ゴトウさんも確認しているので確度は高いですね。

・Windows2000 では コンソール用の API を使う。
適当に以下のキーワード(適当に抽出)で MSDNなりWWWなり
検索してくれ。サンプルくらいは見つかるはずさ。

GetStdHandle
GetConsoleScreenBufferInfo
SetConsoleTextAttribute
--------------------------------------------------
らしいよ。
win2000でDOSなんか使うなってことだ。
char temp[32][32];
これは1回tempに対して配列要素参照演算子を使うと
それがchar型配列と同じだということ。
strcpyに
char arrya[256];
strcpy(array,"いやんもう♪");
と使えるように
cgar temp[32][32];
strcpy(temp[0],">>1さん大好き★"); //temp[0]に文字列をコピー
というように使えるわけわかるでしょ?

2回適用するとそれがそれがchar型だということ。
教える人が出来もしないのに、初心者に教えるだなんて・・・
残念だったが、よく有る事だ。強くイキロよ>初心者
118111:02/04/13 00:37
>>115

私も検索をかけたところ同じように対応してないか、
エスケープシーケンスが無い様な内容だったので・・・

ありがとう、でも使えないのはイタイ
>>117
>>105が初心者に教えるのはCなんだから、
Win2Kのコマンドプロンプトのこと知らなくてもいいんじゃねぇーの?
120デフォルトの名無しさん:02/04/13 00:41
>>111
エスケープシーケンス互換のGDI用ライブラリ作って、それをWindowsで使用したら?
エスケープシーケンスなぞなくてもCは教えられると思うが・・・
# いまだかつて一度も使ったこと無いし漏れ。
122ポインタで…:02/04/13 00:42
>>114
いや、strcpy使ってました…なんでそんなふうに書いたんだろ、俺?

>>116
なんとなくわかります。
ミ゚ω゚彡 >>117は初心者。
124111:02/04/13 00:47
>>120
ありがとう、そうするよ。
125ポインタで…:02/04/13 00:53
先ほどのプログラムを発展させてこんなプログラムを作ってみました。
#include <stdio.h>
#include <string.h>

typedef struct aa{
char name[32];
}SMP;

void main(void){

char temp[32][32];
SMP *foo;

strcpy(temp[0], "Ichiro Suzuki");
strcpy(foo->name,temp[1]);
puts(foo->name);
}
でもfoo->nameがchar型だからうまくstrcpyできないようです。
かといって*(foo->name)にしてもできませんでした。
どうすればfoo->nameがchar *型になりますか?
126ポインタで…:02/04/13 00:54
間違えた。
temp[1]はtemp[0]のつもりでした。
>>125
アフォ
fooは何やねん。
配列に手つける前にポインタもっかい勉強しなおせ。
temp[0]
temp[1]
そりゃそうだろね。
その前に foo を…
SMP smp;
SMT *foo = &smp;
> でもfoo->nameがchar型だから・・・

この発想がどこから来たのかぜひ教えてほしい。
エラーメッセージ読んでる?
132デフォルトの名無しさん:02/04/13 01:00
あんまり初心者に厳しくすんなよ。
133ポインタで…:02/04/13 01:01
>>127
このプログラムがポインタの練習のつもりでした。
もう一度はじめからポインタを勉強しなおします。

>>131
エラー食らわないんです。bccとCpadでやっているんですが。


134結論:02/04/13 01:02
>>125はCのコードを書く前に日本語とK&Rを死ぬまで読みましょう。
BCCって未割り当てのポインタにエラー吐かないの?
警告レベル変えられる?
strcpyの型エラーは出ると思うんだが・・・
137デフォルトの名無しさん:02/04/13 01:10
SMP *foo = (SMP*)malloc(sizeof(SMP));

・・・

free(foo);
138ポインタで…:02/04/13 01:12
foo->nameは構造体の中で定義されているchar name[32]と同義ではないですか?
直接C言語とは関係ないのですが、
printf( "hoge" );
とかやった場合の内部の処理が知りたくてたまりません。
ブロッキングとかノンブロッキング(名前しか知らない)とか
メモリ関係の知識を深めたいんですけど、良本orURL教えてください
>>133
練習ならもっと単純なものからやりなさいな。

int i,*p; //pの指しているものはぁゃιぃオブジェクトを指している
p = &i; //pはこれでiを指すようになる
*p = 10; //わーいo(^-^)oi = 10;と同じだよ
     ヽ( ゚д゚)ノ ワーイ
   -=≡ (  )へ
       >
少しレベルアップ

struct { int i; } s, *p;//pの指しているものはぁゃιぃオブジェクトを指している
p = &s; //pはこれでsを指すようになる
p->i = 10; //わーいo(^-^)o s.i = 10;と同じだよ
143140:02/04/13 01:19
X  pの指しているものはぁゃιぃオブジェクトを指している
○  pの指しているものはぁゃιぃオブジェクト
つーか
×pの指しているものはぁゃιぃオブジェクトを指している
○pはぁゃιぃオブジェクトを指している
 ワーイ ヽ(゚д゚ )ノ
     へ(  ) ≡=-
         く
146144:02/04/13 01:20
うぉ!
ダブった上に直し方がちょと違う(w
>139
CRTのソース嫁。
それ以上は、OSのソース嫁。
それ以上は、半導体デバイスの勉強しる。
それ以上は、量子論を勉強しる。
148デフォルトの名無しさん:02/04/13 01:22
>>125
void main(void)

は、やめれ・・・せめて

int main(void)
main(void)

にしたほうがいいよ。Cの仕様上ね
149 :02/04/13 01:24
型はあってるからコンパイルは通るでしょう

>>132
Cな人が割当ててないバッファのアクセスと
strとmemの使い方間違いとメモリ解放忘れと二重解放に
厳しいのは当然と思います。
忘れてるかもしれないけどみんな通ってきた
150ポインタで…:02/04/13 01:25
>>142
>>125のfooはポインタのまだ何も指していない状態
(ごみが入っている)ということですか?

ということは
*fooがポインタだから何か指さなくちゃいけない?
でもfoo->nameだから構造体の中のchar name[32]を指していると思うんですけど。違うのかな…。
>>147
メモリそのものの動きまでやるか・・・
それなら「やさしいコンピュータ科学」一冊で概要はわかる。
これで扱ってる言語はPascalだけど。
スレ違いだなこりゃ。
>>150
->は矢印だけど、指すんじゃなくて抽出すんの。
foo->nameはfooがnameを指すんじゃなくて、
fooが指してる構造体変数内のnameを取得するってこと。

(*foo).name のほうがわかりやすい?
153デフォルトの名無しさん:02/04/13 01:30
>>150
そのfooの実体が存在せんのだ。よって中身も無い。
幽霊に内臓が無いのと同じだYO!(ワラ
154ポインタで…:02/04/13 01:32
>>152
*fooはポインタで実体じゃないからまだ構造体は生成されていないんですね?
だからfoo->nameなんてものはまだ存在してないということですか?
>>150
レス読むときはゆっくり読みなよ。
人間話すより読むほうが速いから、
読む速度で行くと理解できなくなることもある。
ゆっくりじっくり、しゃべるのより遅いくらいの速さで読んでみそ。
>>150
ブロック内の未代入の変数、ポインタ変数の値は未定義です。
fooはメモリ上の正しいインスタンスのアドレスを保持しなければ
foo->nameをしても、もうヴァカかとアフォかとという状態になります。
あとねfoo->nameの演算子は(*foo).nameと同じです。
>>154
ポインタなのは*fooじゃなくてfooだけど・・・
それ以外はそんな感じでいいYO!
158156:02/04/13 01:36
ウホかぶってた・・・鬱(-_-)
159 :02/04/13 01:37
typedef struct aa{
char name[32];
}SMP;
は型の宣言で定義ではないからメモリの割当ては行われない。

SMP *foo
の宣言(これは定義でもある)はポインタ分のメモリ割り当てしかしない
バイトアドレスが4バイトの処理系なら4バイト割当てられる。
自動変数だから初期値はゴミ

fooの参照先は >>137のように明示的にメモリ割当てを行わなければならない。
160デフォルトの名無しさん:02/04/13 01:38
>>154
だいたいそう。
なんで、>>130か、>>137のようにしる。
161159:02/04/13 01:41
うわかぶってる 逝ってくる
162デフォルトの名無しさん:02/04/13 01:41
わからん。
163デフォルトの名無しさん:02/04/13 01:41
ところで、文字列だけでEOFってむり?ですか? ねぇ?
怪談でもしようか・・・
ある日某専門学生のゲーム作品を見ていて、一つふに落ち着かないことがあった。

それは、彼らが作品を起動し終了をさせるたびに再起動し、また作品を起動させるのであった。
あまりに気になったので彼らに何故そんなことしているのかと問い掛けた。

そしたら、重くなって起動できなくなるらしい。
ソースを見せてくれないか?と問い掛けたら、彼らは気兼ねなくそのソースを見せてくれた。

私は絶句した・・・DirctXを使ったゲームのプログラムだったのだが、
全ての終了コードにはこう打たれていた・・・

exit(1);

と、彼らに未来はあるのだろうか?
全てノンフィクションでおおくりしました・・・
165デフォルトの名無しさん:02/04/13 01:44
...DOSでEXITしてもむりっすよ。文字列だけだとEOFにならん。無限ループになる。CTRL+Cでとめるしかないんすか?
166デフォルトの名無しさん:02/04/13 01:44
>>164
オブジェクトリリースがされて無かったってこと?
167デフォルトの名無しさん:02/04/13 01:45
>>163,165 状況がいまいち分からん。
typedef int* pint;
pint a = pint();
if ( a==NULL ) print( "あひゃ(・∀・)";

これ、typedef使わずにやるにはどうすればよかと?
169168:02/04/13 01:48
ぐふ、そのまま実行すんなよ、printなんて関数はない上に)が抜けてる。
170デフォルトの名無しさん:02/04/13 01:48
入力された文字を検索かけてるけど、WHLIE文でEOFにすると無限ループになるんです。
EOFはファイルじゃないと使えなかった?
171デフォルトの名無しさん:02/04/13 01:51
>>170
文字列なら、\0とかでいいんじゃないの?
172>>139:02/04/13 01:52
>>139
C といっしょに、*UNIX の勉強した方が早い* と進言致します。
低水準とか高水準って説明を真に受けないで、
標準関数とシステムコールの違いをしっかり意識してからの方が
理解が早いでしょう。

こんな感じの本かな
http://www.amazon.co.jp/exec/obidos/ASIN/4894713195/250-9016572-4192253
173164:02/04/13 01:53
>>166
メモリから何から何まで開放せず強制終了させていた・・・
ガタガタブルブル
174159:02/04/13 01:53
UNIXのEOFはCtrl-Dだったと思うがDOSは知らん。
文字列じゃなくて標準入力からEOFは打てないのかという質問ではないですか?
#define EOF (-1)

南無・・・
176デフォルトの名無しさん:02/04/13 01:54
>>170
ダメ。 入力されて判断してるから、無限になっちまうす
>>173
サーフェイスいじくってると面白いように落ちる(←アフォ)けど、
やっぱあれはDirectDraw残ってるのかなぁ。
ウィンドウが消滅した時点で自滅してくれるとうれしいんだけどなぁ。
178デフォルトの名無しさん:02/04/13 01:56
DOSはCrl+Zだったと思う。
つか、どういうコード?
179159:02/04/13 01:57
>>165
ごめんちゃんと読んでなかった 今度こそほんとに逝ってきます
180デフォルトの名無しさん:02/04/13 01:59
>>179
イキロ!
181デフォルトの名無しさん:02/04/13 02:00
文字入力して、それ以降に何回その文字が入力されたかカウントするこーど
すまん、誰か>>181の逝ってることをうまく翻訳してくれ。
183デフォルトの名無しさん:02/04/13 02:04
>>181
ん、、、どうでもいいってことかな?
>>170
入力をchar型で受けてない?
K&R開いてgetchar()とかの帰値の型を空の穴くまでみれ。
185173:02/04/13 02:05
作ったものは開放しないとメモリに残るよ。
勝手に開放されるのもうれしいけど、それだと逆に怖いよ
gets(str);
while(*(str++) != '\0'){
・・・
}
というでわないのか?
187185:02/04/13 02:07
>>177
が抜けてたので逝ってきます・・・
188デフォルトの名無しさん:02/04/13 02:13
>>186
違うみたい。でも、入力をCHARで受けてる。
進行はやっ
(゚д゚) ・・・
191 :02/04/13 02:23
こんな感じ

char c;
while((c = getchar()) == EOF) {
  my_count(c);
}
my_print();

これなら少なくとも cがintでないと無限ループになるよ
?マーク忘れた
>>192
すげー混乱した。
>>191
そうなら、
((c = getchar()) != '\n'
とかで改行終了とか
((c = getchar()) != 0x1b
ESC終了とかでいいでしょ。
>191
char がsignedなら、終わる。
getchar() のプロトタイプは
int getchar(void)
です。
197196:02/04/13 02:52
つまり、
>>191 は char c; でなく int c; とすべきです。
198デフォルトの名無しさん:02/04/13 02:54
LSICのまぬあるより

【解説】

getc(), fgetc()はファイルポインタfpで示されるファイルから1文字を入力
します。
getchar(), fgetchar()は標準入力(stdin)から1文字入力します。
getc(), getchar()はマクロとして定義されています。
これらはcharではなくint型の値を返すことに注意してください。

【リターン値】

入力した1文字を返します。ファイルの終りに到達した時には、値EOFを返し
ます。エラーを検出した場合にもEOFを返しますので、EOFかエラーかの判定
はfeof(3), ferror(3)を使ってください。
199デフォルトの名無しさん:02/04/13 03:00
>>191は質問者じゃないよね?
質問者は寝たか。
200デフォルトの名無しさん:02/04/13 03:06
RS232Cに見えてくるデータを読み出し、ファイルに落としたいんですが
どんな感じにコードかけば良いでしょうか?どこかにサンプルコードとか
おちてないでしょうか?
>>200
なら、最初からそう質問してくれ・・・
http://pc.2ch.net/test/read.cgi/tech/992057422/
に、いらんレスつけちゃったじゃないか。
202デフォルトの名無しさん:02/04/13 06:13
ゲーム製作では、javaよりCが使われているのは本当でしょうか?
スピードの問題ならアセンブラもゲームでは有効だということなんですか?
>>202
上のはホントです。
下のは一部のライブラリにおいてホントです。
このスレの人達はなんだかんだ言って優しいと、
>>125からのやりとりを見て心底思った。
205デフォルトの名無しさん:02/04/13 07:52
>>203
ということは、cを中途半端な状態でjavaに行くよりしっかりとcを極めたほうが
言いということでしょうか?それとアセンブラもわかってないと困ることに
なるんでしょうか?
よろしくお願いします。
cは概要だけでいい。
できればいきなりjavaに行くのがいいと思うが・・・

cにどっぷりつかっちゃうと、javaのスタイルになれるのに時間がかかる
>>205
自分が何をやりたいのかはっきりさせること。
これが一番大事。動機付けて勉強できるという意味じゃ
他の分野の勉強するよりもプログラミングってのはいい位置にある。
目的がはっきりすれば自ずとどんな知識が必要になるのか分かるってもんだ。
208デフォルトの名無しさん:02/04/13 08:33
>>207がイイこと言った!!
>>205
基本的に>>206に同意する。
つまり、Javaのスタイルに慣れておけば、Cでも、見通しや保守性の良い
スタイルでプログラミングできるようになると思う。

あと、アセンブラを勉強しておくと、実行効率の良いプログラムが
書けるようになるはず。
ちなみに、アセンブラはCやJavaに比べると単純な言語なので、
覚えるのは簡単。ただ単に、書く量と手間がかかるだけだよん。
>>209
俺はアセンブラをRISCの様な言語だど言ったらモルァ!すれでゴルァ!された。
211209:02/04/13 10:11
>>210
CやJavaをCISCとするなら、たしかにアセンブラはRISCのような
言語に思えるけど・・・ゴルァ!されちゃったですかー。
javaに慣れてどうするの?とは思うが。
>>212
マジでそう思うの?
>>206
205じゃないですが、なるほど。
一通りCを勉強したらJavaもやってみますわ。
>>209
> ただ単に、書く量と手間がかかるだけだよん。

これがやっかいなんだが・・・
>>207
禿ドウ
言語やライブラリの知識があっても何も作らない人もいる。
それはそれで別にいいんだけど、そういうやつに限って
人に知識を自慢してきてウザかったりすることが多い

やっぱプログラマたるものなんか作ってナンボだよな
言語オタは逝ってよし
217デフォルトの名無しさん:02/04/13 14:21
atan2をテーブル化したいんだけど
どうすればいいですか?
218デフォルトの名無しさん:02/04/13 15:31
結局のところ、ポインタを極めてからjavaに行くか、ある程度のところ(入門書程度)
で切り上げてjavaに行くかで悩んでるのですが、そのあたりはどうなんでしょうか?
ゲーム製作が目的ならJavaじゃなくてC++に行くべきでは?
市販のゲームはほとんど全部C/C++製だろ?
220デフォルトの名無しさん:02/04/13 16:56
>>217
単純にプログラム起動時に一度だけテーブルを作成すればいいんじゃない?
>>218
ポインタ知らないとバカにされます。
一生JavaやC#の様な過保護箱庭言語だけ使うつもりなら止めませんが。
>>221
そういうのだけはなりたくないな。
223デフォルトの名無しさん:02/04/13 17:59
組込みや制御、もしくは OS、 OS に近い部分をちゃんと理解したいなら、
ポインタの理解は必須です。つまり、こんぷーたを本当に理解したいか否かです。
アセンブラもやった方がいいに越したことはないですが、
C のポインタを構造体、共用体を絡めてきちんと理解できていれば十分でしょう。
まぁ、これを理解するのもアセンブラをやったほうがハヤーイかも知れません。

アプリケーションだけを作っているつもりなら、
C をやらずにいきなり Java などの方が良いかもしれません。
その方がおぶじぇくとシコウをすんなり受け入れられるでしょう。
(この辺は >>206 にはげどうです。)
224デフォルトの名無しさん:02/04/13 18:02
>>221
それは絶対にいやなんですけど。
やっぱポインタを極めてからjavaに移行するほうが身のためでしょうか?
でもあんまりCにはまるとjava理解するのに時間がかかるという方が多いので、
jabvaがわからなくて大規模プロジェクトに参加できないのではと不安になって
しまいます。ちなみにポインタを極めるのには思いっきりやっても自分の場合、
半年から1年はかかりそうなんですが。
225217:02/04/13 18:11
>220
それはそうなんですけど
atan2ってy/xから角度出すじゃないですか
どうやってテーブルを作成すればいいのかな、と思いまして・・・
うう、能力不足
>>224
ポインタは、確かにひっかかりやすいところもあるけど、
まず本読んで、自分で書いてみないことにははじまらない。
わかんなくなったらまた聞きに来なさい。
>>225
atan_array[y][x]
みたいなのに入れとけばいんじゃない?
atan_array[y/x]ってやるのは得策じゃないと思う。
コンピュータアーキテクチャとOS(といまだとネットワーク)の理解がないと、
どこでどの仕事しようがタダの*兵隊*にしかなれん。

Cをある程度やれば、OSと、その背景にあるコンピュータそのものの理解が
必須になってくるが、Javaから入ると、VMの理解だけにとどまってしまう
可能性がある。ガベコレがどーのとかあおってる連中とかが陥ってる罠だな。
視野狭窄だ。

ポインタを覚えるのが重要なのではなくて、もっと、アプリケーションを支える
環境(OS, ハードウェア)がどうなっているのか、ということに留意すること。
>>224
何でもCでできるんだ!っていうC厨にならなければいい(すべての言語に言えるけどね)。
ポインタを知っておけば参照とかオブジェクトとインスタンスの関係などがイメージしやすいかなと思います。

なんでも知っている分には損はない。
不便な環境を知らないと、便利な環境を便利とは感じない。
一度便利な環境に触れてしまうと不便な環境には戻れない。
やっぱプログラマなら組み込みだよね。
あこがれるけどなりたくはないな。
232初心者:02/04/13 18:32
いきなりCから始めてもなんとかなりますか?
>>232
なんとかなります。
>>228の意見にはよく耳を傾けておくこと。
そしてPC-UNIX、(以下略
234217:02/04/13 18:39
>227
どうもありがとう
なるほど、分けて考えればよかったか

ただ配列がでかくなりそうだ・・・
大丈夫かな
>>232
C++は分からないけど、Cなら大丈夫でしょう。
ポインタだって通常の変数と同じようなものだと考えれば引っかかることはないし。
236227:02/04/13 19:38
>>234
ゲーム等に使うなら、256x256くらいの分解能があればだいじょぶかも。
atan_array の型をsigned shortにして、整数部 9bit(符号付) + 小数部 7bitの
固定小数として扱えば、±180度カバーできて、1要素2バイトなので、
デーブルサイズは128KBでいけるかな。
>>235
参照時の動作が異様に普通の変数と違いますが・・・。
238227:02/04/13 19:54
>>234
ごめん。よく考えたら、2次元配列にするひつようなかった。
xとyの絶対値が大きいほうが256とか1024になるように正規化
(xがデカい場合は、y = 1024*y/x; x = 1024; みたいな)すれば、
degree = atan_array[xかyの絶対値が小さいほう];
ってな感じで、1次元配列でOKでした。
239224:02/04/13 20:03
皆さんどうもありがとうございます。
それと、アセンブラなどの知識はどの程度もっていたらいいでしょうか?
やっぱりゲームとかやりたいなら、結構やっておいたほうがいいでしょうか?
それと、ゲームではどの程度アセンブラが使われているのでしょうか?
>>239
世に出てるゲームで、VB製がどれだけあるか考えてみろ
VBでインラインアセンブラが使えるか考えてみろ

VBは確かに糞ゲーが多いが、そんなことを質問している時点では
その糞ゲーすら作れないから安心してできる事からやれ。
そもそも3Dのゲームでも現在はアセンブラを使うのはごく一部。
最適化ヲタでもない限り、わざわざアセンブラを使う野郎は少数派
241デフォルトの名無しさん:02/04/13 20:08
おまえらな、いつまでも古い言語つかってんじゃねーよ
これからはPERLだよ、PERL。わかったか、ヴォケ
>>241
Ver 6まで行こうとしてる言語が新言語か?
243デフォルトの名無しさん:02/04/13 20:15
>239 = >>224
おそらくまだかなり若いのでしょうけど、はっきりいって、プログラミングに向いてないと思います。
プログラミングは自分で体を動かさないと身につきませんよ。
244217:02/04/13 20:51
>238
そっちのほうがよさそうですね
使わさせてもらいます
245デフォルトの名無しさん:02/04/13 21:24
>>242
それは言わない約束だろ
246デフォルトの名無しさん:02/04/13 22:11
Cの勉強を始めたのですが
Web上では捜し物をするとあまりにいろいろなモノがヒットしてしまい
探しにくいのですが
「ここが総本山」的な日本語C言語解説サイトとかリンク集ってありますか?
ねこでも
猫とCFAQ
>>246
つぅかネットなんかで基礎勉強しようとするな。
善し悪しがわからんうちは本読んでろ。
ダメ本も数多いが、webの解説のほうがクズ率高い。
>>237
使い方はかわらないだろ。
>>246
とりあえず本は2冊以上買え。Cの入門書は比較的ハズレが多いから
1冊だけ買った本が糞だと自分も糞プルグラマーになるぞ。
253デフォルトの名無しさん:02/04/14 00:39
あした本屋さん逝きますよ。
とりあえずK&R買え。
K&Rより安い入門書は全部糞。
入門と書いてある本も糞。

K&Rおいてない本屋は行く価値無し。
はじめての時は、できるだけ、安くて薄い本がいい。
もちろん、それ以外に辞書(?)としてK&Rを買うのは忘れずに。
だから未経験で心配なら結城せ、せんせぇを追加しておけばなんの問題も無い
と前から言ってるでしょーが!
257デフォルトの名無しさん:02/04/14 01:05
漏れはI/Oで覚えましたが、なにか?
もれはもれもれです
オレ、Microsoft C ver.3.0 とかいう技評かどっかの本だったような
気がするけど、既にその本無くしちゃったので詳細不明。
なんとかしてもう一度手に入れたい。
っていうかアヒル本読めや。
261253:02/04/14 02:41
一冊だけ初心者向けの本持ってますが、
アセンブラー&マシン語でのプログラミングにくらべると
わかりやすいですね、C言語って。

MSXでアセンブラ使ってたころが懐かしいです。
262デフォルトの名無しさん:02/04/14 02:49
このスレ殆ど学生しかいないのか?
>>262
そのようですね
264デフォルトの名無しさん:02/04/14 03:13
CでDOS窓で動くインベーダゲームは作れますか?
265デフォルトの名無しさん:02/04/14 03:17
できるよ
266デフォルトの名無しさん:02/04/14 03:21
>>261
いきなりC言語に入った人と、一度でもアセンブラを経験した人とでは、C言語に
対する基本的な知識の習得の度合いが違うようです。
それはポインタの学習時に顕著に現れるように思います。アドレッシングモード
の言葉の意味がわからない人は、特にポインタを気持ち悪がって使わない傾向
があります。すぐ暴走したり、原因不明の動作をしたりするからです。
C言語をどのように使うかは全く自由ですが、せっかくですからポインタを自由
自在に扱いたいですね。
>>265
ありがとよ。
Ultra-Cってソフトあったんですけど、これだけでC勉強する
には、十分ですか?
269デフォルトの名無しさん:02/04/14 04:47
充分
>>268
Cのインタプリタ? 入門にはいいんじゃないかな。使った事無いけど。
これから買う事はお薦めしないけど、持ってるなら有効に活用すべし。

但し、勉強に十分とは言えないかと。
せめてCの基本的な文法とか覚えたら、さっさとbc++やgccに移行して
コンパイラに慣れておく事をお薦めする。
>>269 >>270
サンクス。とりあえず、これで勉強します。
コンパイルエラーが一番の先生だと思わないか?
273デフォルトの名無しさん:02/04/14 05:27
>>272
カコヽ(`Д´)ノイイ
>>273
カコイイかもしれないけど、Cだとコンパイラのエラーメッセージで学習は無理だろ・・・
gccの-Wallで警告無しでも、気休めにしかならないのがC言語なんだから。
o = --o - o--;

これで必ずoには-1が入るとかアフォなこと言ってた人がいたよぉ
ママーン
これほどまでに、Cのソースが書き込まれずに、スレが進行するのも珍しいな。
277デフォルトの名無しさん:02/04/14 10:53
達人の方々、ご教授お願います。
unsigned short x;
で、1byte目と2バイト目を入れ替える時、
x = ((char*)x)[0] * 0x100 + ((char*)x)[1] & 0x00ff;

x = x >> 8 + x << 8;
と書く場合とでは、とちらが処理速度が速くまた美しいのでしょうか?
どちらか速いか:たぶんレジスタ上で処理を終えられるかもしれない下の方が、必ずメモリアクセスを発生する上の方より、速いんじゃないかなぁ。

どちらが美しいか:そりゃ下の方だろう。上の方が美しいとか思うか?
下のじゃ正しく変換できないがな
280デフォルトの名無しさん:02/04/14 11:05
関数ポインタですが、あれはどういうときに使うのでしょうか?
アドレスを持った関数、(ポインタ変数の関数版?)ということだと思うのですがいまいち使い方が思いつきません。
用のないときは使わない、ということでよいのかもしれませんが、気になってます。
どういう場合なら使えるのでしょうか?
使用上、効果的な具体的な事例はあるのでしょうか?
環境はWINDOWSXPにVC++6(.NETも一応あります)です。
関数ポインタは関数へのポインタ。
282デフォルトの名無しさん:02/04/14 11:08
関数のアドレスを持つポインタ、ということですか?
です。関数に関数を渡すときに使います。
K&R の quick sort のとこに確かありました。
>>277
エソディアソの違いは?
少し前からCの勉強はじめたんですが、本のなかに
123を表示するとき
printf("%d\n",123);
と、書いてあるのですがどうして
printf("123");
と、直接書いてはいけないんですか?
いけないことはない。
>>286
ありがと。これから123と普通に書く事にします。
>>284
入れ替えるだけならエンディアソは関係ないと思ふ。
289277:02/04/14 11:47
レスありがとうございます。

>>279
正しく変換できないとは?

当方素人です。ご教授願います。
290277:02/04/14 11:50
>>284
エソディアソとは何でしょうか?

C言語(C++,VCは抜く)だけだと、どの程度のゲームが作れますか?
画像をある程度使ったものなども作れるのでしょうか?
>>277
上: エラー「メモリがreadになりませんでした」
下: 正常に変換されなかった

正確にコード書け。素人は免罪符にはならん。

エンディアン: http://yougo.ascii24.com/gh/00/000012.html
ANSI C には、画像を扱うライブラリは規定されていませn。残念です。
>>293
なるほど。
ではVC++までいかないと無理ですか?
295カツオ:02/04/14 12:32
UNIXでCプログラミングを始めたいのですが、
Linux、FreeBSD、NetBSDのどれにしたらいいと思いますか?
どれでも。
>>294
標準として規定されてない(つまり、全てのOSで共通に使える画像ライブラリは
無い)けど、特定のOS用の画像ライブラリはくさるほどあるから、
心配すんな。

どの程度のゲームが作れるかについては、君が見たことのある
全てのゲームは、どうにかして作れるから安心したまい。
>>295
どれでもいんだけど、あえてオレらに決めてほしいのなら、
NetBSDにしとけ。
無難なところでFreeBSDだろ。
ミーハーで派手好きならLinuxでもいいかもしれんが。
>>295
つーことで、サイコロ持ってる?無かったら鉛筆でもいんだけど・・・
301277:02/04/14 13:25
>>292
うろ覚えでコードを書いていました。

上:x = (((char*)&x)[0] * 0x100) + (((char*)&x)[1] & 0x00ff);
下:x = (x >> 8) + (x << 8);

下のほうが処理速度及び美しさで勝る、と言うことで宜しいでしょうか?

>エンディアン
ご教授ありがとうございます。
エンディアンの変換でこの処理が必要になりました。
>>297
ありがとうございます。
ソフトによってOSが決まってたりするのはそういうことなんですね
>>302
む?
>>301
面倒だから、htons/ntohsで変換しちまえ
>>280
本質的には、コールバック関数の登録のためどうしても必要だぁね。
デバイスドライバのソースの、エントリポイントのテーブルあたりを見ると、
「ほへぇ、なるへそ」と思えるかも。
static struct cdevsw tst_cdevsw = {
tstopen, tstclose, tstread, nowrite,
noioctl, nostop, noreset, nodevtotty,
seltrue, nommap, nostrategy, "tst", NULL, -1
};
こんなん。上のtstopenとかが関数のアドレス。tsopen()の定義は
static int
tstopen(dev_t dev, int oflags, int devtype, struct proc *p) {
return 0;
}
こんな感じ。
>>301
なんで美しい、にこだわるの?
>>305
オブジェクト指向ごっこもできるよね。
美しいつーか見易さだろ
高級言語は
>>306
美しいものを嫌いな人がいて?
アヒル本ってどうなの?わかりやすい?
311デフォルトの名無しさん:02/04/14 16:24
Cの標準関数のstrstrってありますよね?
文字列から指定文字列を見つけるアレです。
もしアレをオリジナルの関数で作るとしたら
どうなるでしょうか?
string.hの中身見てもさっぱりで…
どなたか作れる人いたら教えて
>>311
ポインタを使いましょう
K&R読めば作り方分かる。
効率のことさえ考えなければ、こんな感じ?
char* mystrstr(char* a, char* b)
{
  while(*a){
    if(strcmp(a, b) == 0){
      return a;
    }
    ++a;
  }
  return NULL;
}
constくらいつけろよ...
316311:02/04/14 16:30
ごめんなさい。
ポインタ使ってます。
char strstr(char *str,char *search)
{
int i=0,k,i2=0,work;

while(*(search+i) != '\0'){
i++;
}
while(*(str+i2) != '\0'){
if(*(str+i2) == *search){
for(k=1;k<i;k++){
if(*(str+i2+k) != *(search+k)){
return NULL;
}
}
return *(str+i2);
}
i2++;
}
return NULL;
}

これで上手く行かないんです。
どうしてもstring.hはincludeしないで
作業進めたいんですけど、どうにもならなくて、
訂正箇所あったら教えてください。
317仮引数:02/04/14 16:33
今自分で関数を作ってるんですけど、仮引数って何個までいいんでしょうか?
現在仮引数が11個でVC6.0を使ってるんですけど仮引数が多すぎるって警告でるんですけど問題ないですかね?
>>317
いや、関数によって決まってるんだろうが…
あんまり引き渡しても
引渡し側が使えないぞ?
普通警告じゃなくてエラーが出るような・・・
仮引数→引数、なら理解できるが・・。
プロトタイプと引数の数が合ってないだけじゃないのか?
>>317
引数が多くて警告なんかされたことないから
わからんな…
なんか関数I/Fの設計がまずい気もするけども。
構造体を利用するのも一つの手だな。
一つの関数で一つ以上のことはするな、と
お父さんかお母さんに教わらなかったのか?
>>316
まず返却値の型が違うな。char *で返してやらないとどこでマッチ
したのかわからないじゃない。それから12行目のreturn NULLが
おかしいな。ここはbreakでforループを抜けるんじゃないか?
他にも問い詰めたい部分はあるが、こんだけ直せば動くんじゃない?
>>316
変数名をもうちこっと何とかしてホスィ・・・。
>>317
実引数の間違いじゃないのか? そうじゃないなら警告コードをさらせ。
char* strstr_(char *s,char* p)
{
int i,n,l = strlen(p);
for(i = 0;s[i];i++){
for(n = 0;s[i+n] && s[i+n] == p[n];n++);
if(l == n && s[i+n-1] == p[n-1])
return s + i;
}
return NULL;
}
なんか違ったらスマソ
>>326
string.h をインクルードしたくないって言ってるんだから、
strlen()も使えないんじゃない?
char* str_str(const char* base, const char* part)
{
 int i;
 unsigned long h1 = 0, h2 = 0;
 size_t len1 = strlen(base), len2 = strlen(part);
 char *p1 = base, *p2 = part, *l = base + len2, *end = base + len1;
 
 if (len1 < len2)
  return NULL;
 for (i = 0; i < len2; i++) {
  h1 += base[i];
  h2 += part[i];
 }
 for (; h1 != h2 || strcmp(p1, p2); ++p1, ++l) {
  if (l == end)
   return NULL;
  h1 -= *p1;
  h1 += *p1;
 }
 return p1;
}
コッチだ、スマソ

char* str_str(const char* base, const char* part)
{
 int i;
 unsigned long h1 = 0, h2 = 0;
 size_t len1 = strlen(base), len2 = strlen(part);
 char *p1 = base, *p2 = part, *l = base + len2, *end = base + len1;
 
 if (len1 < len2)
  return NULL;
 for (i = 0; i < len2; i++) {
  h1 += base[i];
  h2 += part[i];
 }
 for (; h1 != h2 || strcmp(p1, p2); ++p1, ++l) {
  if (l == end)
   return NULL;
  h1 -= *p1;
  h1 += *l;
 }
 return p1;
}
━(゚Д゚;)━>
     グサッ
マアイイヤソノクライ
>>330
どうした?
strlen って思う存分 string.h を必要とするやんかー。

char *mystrstr(const char *str, const char *search)
{
    const char *p1, *p2;
    while (1)
    {
        p1 = str;
        p2 = search;
        while (*p2 && (*p1 == *p2))
        {
            ++p1;
            ++p2;
        }
        if (! *p2)
            return (char *)str;
        if (! *p1)
            return NULL;

        ++str;
    }
    return NULL; /* tricking compiler */
}

私ならこう書くっす。
(char *) ってキャストしてるけど,C++ なら const_cast 使うべきっすね。
>>329
なるほろ!
毎回比較する必要はないのか!
>>329
どっかのMLで見たソースだな、そりゃ(藁

>>332
それは文字列が長くなると遅いな
335326 == 330:02/04/14 17:55
>>326のstrstrの前に
int strlen(char *p){int l;for(l = 0;p[l];l++) return l;}
>>329のソースは比較対照が十分長くないと逆に遅くないか?
>>329
うわ,なるほど,一種のハッシュみたいな感じかー。
実はたった今,マッチング処理の速度向上に苦しんでたんスよー。
>>336
最初のstrlenの長さで処理を振り分ければいいかな。
>>337
ハッシュじゃBM法の方が早いだろ。
文字列の比較は多バイト一度にできるビッグエンディアンのほうが効率的?
専用の命令のあるx86 CPUが効率的
>REPE CMPSB
>>314
strncmp(a,b,strlen(b)) == 0
343超感謝感激!!:02/04/14 19:26
>>332サン
有難うございます!!
自分ではナニブン思いつかないものでして
かなり困っておりました。
おかげで先に進む事が出来ました。
本当にに有難うございました!!
344デフォルトの名無しさん:02/04/14 23:33
今、C言語アルゴリズム+徹底入門で
双方向リスト構造について勉強しているのですが、
下のサンプルプログラム(番号を入力する毎に構造体を生成して
昇順に挿入していく)なんですが、2番目に入力した番号が
絶対に先頭に挿入してしまうのです。
先頭に挿入する場合の条件式がおかしいのだと思っていろいろ
いじってみたのですが、うまくいかず・・・。
すみませんがよろしくお願いします。
345デフォルトの名無しさん:02/04/14 23:35
☆☆Sample09_02☆☆
#include <stdio.h>
#include <stdlib.h>

/* list構造体とLISTを定義する */
typedef struct list {
int data;
struct list *prev;
struct list *next;
} LIST;

/* リストに新しい要素を挿入する */
LIST *InsertItem(LIST *lp, int x)
{
LIST *lpnew, *lptemp;

/* 新しいリスト要素を生成する */
lpnew = (LIST *)malloc(sizeof *lpnew);
if (lpnew == NULL) {
/* stderrにエラー文字列を出力する */
fprintf(stderr, "メモリーエラー\n");
/* exit()関数を使って実行を終了する */
exit(1);
}
/* 新しい要素に値を代入する */
lpnew->data = x;

/* 初回のケース */
if (lp == NULL)
{
/* 初回は自分自身を指しておく */
lpnew->prev = lpnew->next = lpnew;
/* 新しい先頭を返す */
return lpnew;
}

lptemp = lp;
/* 挿入位置を求めてリストを前進する */
while (lptemp->data < x && lptemp->next != lptemp)
lptemp = lptemp->next;
346デフォルトの名無しさん:02/04/14 23:36
/* 先頭挿入のケース */
if (lptemp->prev == lptemp)
{
lpnew->prev = lpnew;
lptemp->prev = lpnew;
lpnew->next = lptemp;
/* 新しい先頭を返す */
return lpnew;
}
/* 末尾挿入のケース */
if (lptemp->data < x && lptemp->next == lptemp)
{
lpnew->next = lpnew;
lpnew->prev = lptemp;
lptemp->next = lpnew;
/* もとの先頭を返す */
return lp;
}
/* その他のケース */
else
{
/* 1つ前の要素に戻す */
lptemp = lptemp->prev;

lpnew->next = lptemp->next;
lpnew->prev = lptemp;
lptemp->next->prev = lpnew;
lptemp->next = lpnew;
/* もとの先頭を返す */
return lp;
}
}
もしCの文法がわかってて、それくらい自力で解決できないなら、
プログラマになるのはやめておいたほうがいいと思われ。
348デフォルトの名無しさん:02/04/14 23:44
main()
{
/* 空のlpheadを宣言する */
LIST *lphead = NULL;

/* リストに要素を挿入する */
lphead = InsertItem(lphead, 20);
return 0;
}
いや、誰でも通ってきた道なんでないの?

理解しようと努力してるだけ、ましだと思う。

とりあえずどういうデータを入力したのかも書け。
350デフォルトの名無しさん:02/04/14 23:54
とりあえずサンプルではこんな風に入力してた。
2番目を1番目より低い値を入れてるところが
なんかバグを隠そうという意思がみられるのですが・・・。
技術評論社いってプログラム修正してないか見にいったけど
直ってなかったよ。
lphead = InsertItem(lphead, 20);
lphead = InsertItem(lphead, 10);
lphead = InsertItem(lphead, 15);
lphead = InsertItem(lphead, 20);
lphead = InsertItem(lphead, 14);
lphead = InsertItem(lphead, 9);
lphead = InsertItem(lphead, 22);
lphead = InsertItem(lphead, 9);
lphead = InsertItem(lphead, 14);
>>344
うちではちゃんと動いてるよーん。
352デフォルトの名無しさん:02/04/14 23:56
例えば、
1,2,3,4,5,6,7,8
と入力すると
2,1,3,4,5,6,7,8
ってなる。
これさ、双方向リストなの?
なんかかなり間違ってる気がするんだけどもよ。
354デフォルトの名無しさん:02/04/14 23:58
>>351
マジ?
コピペして実行したんだが・・・。
355351:02/04/15 00:01
>>354
ごめん。1〜8だと確かにそうなる。
while()で挿入位置を決めてるところが不完全だーね。
ちと修正中。
356351:02/04/15 00:04
while()のとこはどうしようもなかったので、先頭挿入時の条件追加でかんべん。
/* 先頭挿入のケース */
if (lptemp->prev == lptemp && lptemp->data >= x)
>>344に仕事を発注しちゃ逝けない。
>>344にデバッグもさせちゃ逝けない。
誤爆鬱ハンギングマイネック
359デフォルトの名無しさん:02/04/15 00:08
>>356
サンクス!
今、リスト構造使って住所録作ってるんだけど
別に双方向であるひつようないな・・・。
もうちと勉強しなおしてキマス・・・。
先頭だろうが末尾だろうが、
場合分けしてるあたりで三流コーディングの気配。
361デフォルトの名無しさん:02/04/15 00:11
>>360
柏原正三って三流なのか?
362351:02/04/15 00:12
>>360
漏れもそう思った。
でも、先頭と末尾にダミーがないから、しょうがなかった。
えーん。
>>361
俺的には独習Cの評価はかなり下。
素人に分からせるためにわざとダメコードを書いてる節が見える。
赤ん坊にあかちゃん言葉教えてしまうと
まともな言葉を覚えるのが遅れるってやつか
>>361
三流
柏原正三の本、いちども読んだことないな。
例外かもしらんが、K&R以外の入門書はどれみても
あらばかり見えてまともに読んだことない。

ASCIIのC言語入門三部作よりはましだったように思えるが...

367デフォルトの名無しさん:02/04/15 00:42
リスト構造が環状になっていて扱いにくいので、先頭と末尾はNULLにしました。

/* リストに新しい要素を挿入する */
LIST *InsertItem(LIST *lp, int x)
{
LIST *lpnew, *lptemp, *lptemp2;

/* 新しいリスト要素を生成する */
lpnew = (LIST *)malloc(sizeof *lpnew);
if (lpnew == NULL) {
/* stderrにエラー文字列を出力する */
fprintf(stderr, "メモリーエラー\n");
/* exit()関数を使って実行を終了する */
exit(1);
}
/* 新しい要素に値を代入する */
lpnew->data = x;

/* 初回のケース */
if (lp == NULL) {
lpnew->prev = lpnew->next = NULL;
/* 新しい先頭を返す */
return lpnew;
}

lptemp = lp;
/* 挿入位置を求めてリストを前進する */
while (lptemp && lptemp->data < x) {
lptemp2 = lptemp;
lptemp = lptemp->next;
}
368デフォルトの名無しさん:02/04/15 00:42
if (!lptemp) {
/* 後尾挿入の場合 */
lptemp = lptemp2;
lptemp->next = lpnew;
lpnew->prev = lptemp;
lpnew->next = NULL;
return lp;
} else if (lptemp->prev == NULL) {
/* 先頭挿入の場合 */
lptemp->prev = lpnew;
lpnew->prev = NULL;
lpnew->next = lptemp;
return lpnew;
} else {
lptemp2 = lptemp;
lptemp = lptemp->prev;
lptemp->next = lpnew;
lpnew->prev = lptemp;
lpnew->next = lptemp2;
lptemp2->prev = lpnew;
return lp;
}
}
>>367
漏れもNULL大好き。ぬるぬる。はふぅ。
370デフォルトの名無しさん:02/04/15 00:51
>>369
うん。さっきの環状のリストの修正だけど、まだおかしい所があるよ。
同じ値を2回以上入れるとリスト構造が壊れてしまう。
371デフォルトの名無しさん:02/04/15 00:51
>>お前だめだよそんなことしちゃ...
NULL NULLに挿入・・・(;´Д`)…ハァハァ
373デフォルトの名無しさん:02/04/15 02:23
int a = ( 1, 2, 3 );
という文でaに3が代入されるのですが、なぜそうなるのか、なぜコンパイルエラーにならないのか教えてください。
>>373
そういう文法だからだYO!
,演算子調べる!
375デフォルトの名無しさん:02/04/15 02:27
>>373
','で区切られた式の評価は左から右へ。
よって、(1,2,3)は3に等しい。
そう、そして式としての値は左オペランドのものだから。
>>373
多分最適化によって1と2は無視されるケースが多いと思われ。
右だった(;´-`)
お箸持つほうが値になるの,わかったわね
>>378
は〜い。わかりまちた。ちぇんちぇい〜
380デフォルトの名無しさん:02/04/15 05:26
>>329
printf("%s\n",str_str("mystrstr","str"));とやったら、strstrと表示されるはずだよね?
(null)って表示されるんだけど(Linux+gcc)。
何やってもNULLが返るんじゃないの?

コンパイルできないから全角スペースは半角スペースに置き換えたけど、それ以外はいじっていない。
>>380
作ってもらって感じ悪いね。
うごかなけりゃ修正すればいい。
骨組みも方針もある。
382デフォルトの名無しさん:02/04/15 07:17
>>381
つくってもらって?
俺は質問者じゃないけど。
というか作ったんじゃなくてコピペしただけでしょ。
384名無しかも:02/04/15 08:21
配列を使うときは、
 
     要素型名 変数名[要素数]

で使うわけですが、
その格納するための要素数が大きすぎてわからなかったりする場合、
要素数をどう決めたらいいのでしょう?
要素型名 *変数名;

にして、
変数名 = (要素型名 *)malloc(sizeof(要素型名) * 個数);

使い終わったら
free(変数名);

しなさい。
>>380
どうぞ。
コンパイルしてなかったんで、動作確認してなかったよ。

char* str_str(const char* base, const char* part)
{
 int i;
 unsigned long h1 = 0, h2 = 0;
 size_t len1 = strlen(base), len2 = strlen(part);
 const char *p1 = base, *p2 = part, *l = base + len2, *end = base + len1;

 if (len1 < len2)
  return NULL;
 for (i = 0; i < len2; i++) {
  h1 += base[i];
  h2 += part[i];
 }
 for (; h1 != h2 || strncmp(p1, p2, len2); ++p1, ++l) {
  if (l == end)
   return NULL;
  h1 -= *p1;
  h1 += *l;
 }
 return (char*)p1;
}
387384:02/04/15 08:37
早いレスありがとうございました♪
>>159
ていうか、あからさまにキーワード「typedef」が使われる由。
Type を define してるんだヨって、思いっきり言ってやりたいよね。
やっぱ、エラー等のメッセージも >>133 は無視してるんだろね。
なぜ今更>>159に。。。
>>385
見て思ったんだけど
#include <stdlib.h>
すれば
malloc()
はキャストしなくてもいいんでしょ?だめ?
391名無しさん@お腹いっぱい。:02/04/15 11:54
ファイルを読んだり書いたりするのは
fprintfとかfwrite,freadでやっているのですが、
ファイルの消去はどうすれば良いのでしょう?
今は
system("/bin/rm -f hoge");
ってやっているのですが、これだとrmコマンドが/bin の下に無い場合エラーが出てしまいますし・・・
remove
393デフォルトの名無しさん:02/04/15 11:58
unlink()
stdio.h に
int remove( const char* filename )
ってないか?
ANSIのはずだけど。
>>394
unlinkが一般的でなかったかい?
unlinkはunixだろ
だめ。>>390
stdlibのプロトタイプでもmallocの返値はvoid*だから。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
398390:02/04/15 12:11
>>397
http://www.catnet.ne.jp/kouno/c_faq/c7.html#0

C FAQ 7.7に、ANSI/ISO規格のCでは警告を黙らせるためのキャストは必要ないっ
て書いてあるけど。
警告は出なくても問題はある、ってことですよね。例えばどんな時?
>>398
いろんな環境でコンパイルできるようにするには、キャストしといたほうが
いいかも。なんとなく。
>>399
それ言い出したらきりがないべ。
401391:02/04/15 12:24
>>392-396
ありがとうございます。
remove はstdio.h 、unlink はunistd.hでした。

Linux上でmanを見ると
>removeはファイルシステムからファイル名を削除する。ファイルに対しては unlink を、ディレクトリに対しては rmdir を呼び出す。
と書いてありましたので、remove を使えば問題ないですね。
>>230
まぁ、一般論としては、そうだけどさ。
「〜知らないと〜」の件は、想像力の問題。
「〜触れてしまうと」の辺りは、真剣さの問題。
ともに、本人の能力と環境に依存。
403デフォルトの名無しさん:02/04/15 14:09
#include <stdio.h>

int main()
{
int num;
char c;

scanf("%d", &num);
scanf("%c", &c);

printf("整数データ = %d\n", num);
printf("文字データ = %c\n", c);

return 0;
}
このサンプルをコンパイルして実行して
Z 12345
と入力しました。

本の見本では
整数データ = -1073744244
文字データ = Z
と出ています。

しかし自分の環境(FreeBSD x86 gcc2.95.3)では
整数データ = 671396813
文字データ = Z
と表示されます。
これは何故でしょうか?
404デフォルトの名無しさん:02/04/15 14:24
>>403
numにはゴミが入っているからだ。

例えば
 int num;

 int num = 0;
としてやってみろ。
scanfの戻り値を見ていないので、それが失敗していることが分からない。

失敗した結果numに何も書き込まれないので、それ以前にnumに入っていた値
(初期値を指定していないため、不定値)のままということでんな。
> 本の見本では

何の説明もなくそんなサンプルと実行結果を挙げているなら、その本がタコ。
「このような結果になるのでscanf()の戻り値チェックを忘れるな」という
説明が付いていてそれを見落としていたなら、>>403がタコ。
407デフォルトの名無しさん:02/04/15 16:41
タコ本は焼き捨てろ。
見本にわざわざ値がでてるのはやっぱり
「こんなぐちゃぐちゃなことになるぞ」って例じゃないかと推測。
それなのに「ぐちゃぐちゃ」部分が一致しないって騒いでるんじゃないのか?
409デフォルトの名無しさん:02/04/15 16:52
ハァハァ(゚з゚)
その本の「自動変数」のページよんでないだろ
411403:02/04/15 17:17
自分がアポだったようです。
お騒がせしまし
>>311
*.h の中身見て
処理のアルゴリズムが分かると思ってるのかyp!
実はインライン関数かも知れん(違
414デフォルトの名無しさん:02/04/15 18:47
Winmain()から、Dialogを作成するじゃないですか。
そのダイアログにリソース上のBitmapを描画するにはどうすればいいですか?
415デフォルトの名無しさん:02/04/15 19:34
いま望洋さんの本で勉強しているのですが、基本型って難しいですね。
C言語はポインタの理解でつまずきやすいと聞いていたのですが、
その前に挫折しそうです。
>>414
簡単簡単。
http://kumei.ne.jp/c_lang/sdk/sdk_26.htm
http://kumei.ne.jp/c_lang/sdk/sdk_13.htm
を見よ。
つーか、リソースエディタでぺけっと張りつけとくってのもイイ。
>>311
オリジナルで作る必要はない。というか、既にあるものを作ってはいけません。
バグが出るだけです。
(勉強のため、ってんなら、もちろん構わないけど)

http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/string/?lang=ja
ここらへんからパクりなさいな。
いま出回ってる「Cの絵本」って
なかなかわかりやすくて良かったですよ。
ただこの本のほかに辞書的な本は絶対に必要ですけど。
419デフォルトの名無しさん:02/04/15 21:15
414です。
あっと、リソース上というのはリソースエディタで書いたもののことです。
ぺけっと…といわれてもいまいち解らないのですが教えていただけますか?
420416:02/04/15 22:29
>>414
こんなかんじだ〜
1.リソースエディタで、ダイアログを表示しときます
2.ピクチャーコントロールを適当に張りつけます
3.そのピクチャーコントロールのプロパティを開きます
4.「タイプ」のとこが「フレーム」になってるとおもうので、コレをビットマップにします
5.そしたら、その下の「イメージ」のとこで、ビットマップのIDを選びます
どうかな。

あんま図解は無いけど、一応リソースエディタの説明
http://www.page.sannet.ne.jp/mtoga/lang/cv/bih-m_51.htm
>>417
標準のstrstrはものすごく非効率だったりするから、
場合によっては作った方がいい
422417:02/04/15 23:19
>>421
そういうときは、効率がいいものをパクろう。
423デフォルトの名無しさん:02/04/16 08:04
>>421
非効率でもいいじゃん。
>>423
効率いいほうがいいじゃん。
425あたりまえだけど、:02/04/16 09:27
ボトルネックだったら改良すれってことでしょ?
426デフォルトの名無しさん:02/04/16 10:50
void debug_print(const char *format, ...);

#ifndef DEBUG
#define debug_print if(0) debug_print
#endif
この書き方ってありですか?
リリース時にdebug_print()が無駄にリンクされてしまうのと
debug_print(...), foo()とやるとおかしくなるという以外に
何か問題ありますか?
常にdebug_print()がリンクされるのがなんかやだなあ。
#ifdef DEBUG
#define dprint(x) debug_print x
#else
#define dprint(x)
#endif
とやって、debug_printは直接呼ばずにdprintを必ず dprint(("msg")); の
ように括弧を二重に付けて呼ぶようにするとか。

あと、gcc拡張だと思うけどプリプロセッサの可変引数を使って、
#ifndef DEBUG
#define debug_print(fmt, args...)
#endif
こういう手も。gcc限定で良ければこっちの方が綺麗か。
428名無しかも:02/04/16 14:08
forとwhileのメリット、デメリットって何ですか?
>>428
そんなのあるの?別にないんでわ?
430デフォルトの名無しさん:02/04/16 15:16
whileの方が可読性が高い
>>430
場合によるじゃん。
>>428
メリット・デメリットと言われると違和感があるが、

while: どんな繰り返し処理も記述できる汎用的な方法。
for: ある種の繰り返し処理を分かり易く記述できる。

という違いはあるわな。for文でうまく記述できる処理は
for文で書いた方がすっきりするんでない?
433428:02/04/16 15:28
そっかぁ・・・・。
なるほど、わかりました。サンクス
for(;;) と while(1) のどっちがいいか、っていう話かと思った。
>>434
無条件ループならfor(;;)のほうが条件がない感じがはっきりしてていいなあ。

while(1)って、定数条件によってループするってのが気持ち悪いの(if(1)も同じ)と
なぜ「1」なのか(2でも3でも良いし、結局捨てられる)という点も気持ち悪い。

C99 or C++なら、while(true)にすることで印象は改善するが…。
forにするかwhileにするかはかなり好みの問題である。
forは明らかに、一つの単純な初期化
およびインクレメントのあるときに最も有利である。

↑これが全て。
>>435
一応、真偽を返す標準関数は真の場合1を返すことに決められてるけど。
だめ?
is_*系の判別するのは標準関数やないの?
>>435
while (1e-99) のように、浮動小数点でも無視されるようですね。結局
非0でなければ何でもよいのか。
そらそうでしょ
そらそうじゃないや(w
>>441
そうであります。「非0でなければ」ではなく、「非0であれば」ですよね。
443437:02/04/16 17:54
>>438
例外もあったと思う。差を返すstrcmpとか。
あと、ANSI C言語辞典には、
論理演算(ビット演算ではない)は、真の時1
と書いてあった。
1は真だが真は1じゃない。
>>444
必要条件を満たしているが十分条件ではない。
9割9分あり得ないとは思うが、将来的に1が真でなくなる時も来る可能性はある。
実際C#では(以下略)
>>444
もちろん、判定の時は非0が真、真は非0なんだけど、
式の評価値や関数の戻り値としては、「真なら1を返す」ってのが決まってるものも
あるんだよ。
448437:02/04/16 18:08
すまん。嘘ついた。
標準関数が1を返すってのは根も葉もない妄想でした。ごめんちゃい。
http://www.bpel.tutics.tut.ac.jp/~take/basement/faq-c/faq-c8.html
のA8.2に「組み込みの演算子」って書いてあった。
for(ex1;ex2;ex3)はcontinueしるとex3が忘れずに実行できて便利。
450デフォルトの名無しさん:02/04/16 20:54
Cを勉強しようと思っています。
手本になるものを見ながら覚える方がよいと考えているのですが
良いサンプルになる素材というのはあるのでしょうか?
それとも、皆さんは一から書き始めたのでしょうか?

アフォな質問で申し訳ありません。
>>450
文法知らずに文章書くのって無理です。読むのもママなりません。
452デフォルトの名無しさん:02/04/16 21:00
#ifdef DEBUG
#define debug_print printf
#else
#define debug_print 1 ? 0 : printf
#endif
454デフォルトの名無しさん:02/04/16 21:39
case VK_SPACE
とかくといまくいきますよね。
キーボードのボタンの場合、

case A
としてもうまくいきません。
どうすればいいのでしょうか?
455デフォルトの名無しさん:02/04/16 21:50
>>416
414
う〜ん。いやコントロールは…というのは場合によって
描画座標や横幅を変えたいのですが…。
それで詰まっているのです。たびたび申し訳ないです。
>>454
case 'A' ってことかい?
457414:02/04/16 22:18
>>455
なら、
http://kumei.ne.jp/c_lang/sdk/sdk_15.htm
を参考に、コントロールのハンドルをGetDlgItem();で取得して、
http://kumei.ne.jp/c_lang/sdk/sdk_16.htm
を参考に、そのコントロールの位置やサイズを変えるってのはどお。

漏れ的には、やっぱ最初に教えてあげた
http://kumei.ne.jp/c_lang/sdk/sdk_26.htm
を使うのがいいと思うけどね。
>>456
ありがとうございました
みごとに解決しました
いくらなんでもちょっとヒドすぎる質問が多いような気が…
460デフォルトの名無しさん:02/04/16 22:54
>>459
幸せじゃないか.
461デフォルトの名無しさん:02/04/16 22:56
SDKでするのと、MFCどっちが良いんだろう・・・
ミニゲーム作るとしたら
462デフォルトの名無しさん :02/04/16 22:57
#include <iostream>
using namespace std;

int main()
{
cout << "Hello,C!" << endl;
}

でコンパイルすると
エラー E2209 hello.cpp 1: インクルードファイル 'iostream' をオープンできない
エラー E2282 hello.cpp 2: 名前空間名が必要
エラー E2451 hello.cpp 6: 未定義のシンボル cout(関数 main() )
エラー E2451 hello.cpp 6: 未定義のシンボル endl(関数 main() )

と表示されます。なにが悪いんでしょうか?
>>462
コンパイラは何ですか?古いC++だと、<iostream>のようなstd名前空間の
インクルードが使えないことがある。その場合は<iostream.h>とすればよい。

もしくは、コンパイラの設定で、インクルードファイルへのパスが通ってない
とか。これはよくある間違いなのでもう一度よく設定を見直すこと。
>>462

ここはCスレだっていうの(略)
>>462
コンパイラは?
>>461
ここはCスレなので、もちろんSDK。
でもあくまでCスレなので、SDK特有の質問されても困っちゃう。
467462:02/04/16 23:45
できました。後者が原因でした。ありがとうございます。
ちなみにコンパイラはBorlandC++Compilerでした。

スレ違いの質問してしまったようですね。すみませんでした。
int main(int argc, char **argv)
int main(int argc, char *argv[])
どっちが正しいの?
どっちも正しいよ。>>468
470デフォルトの名無しさん:02/04/17 01:13
Cにおいて関数仮引数の
char *p
char p[]
は全く同じ。
したがって>>468のは両方同じ
俺はchar**派
もうしわけありません
初歩的すぎてもしかしたら怒られるかも知れないのですが、質問させてください
スレ違いでしたら申し訳ありません

Windows、VCでエディットボックスを扱っているのですが、
大量に書きこむと表示がバグってしまいます

でもエディットボックスの中身をファイルに出力すると正常です

hEdit = CreateWindowEx(
0,
"EDIT",
NULL,
WS_CHILD | WS_VISIBLE |
ES_WANTRETURN | ES_MULTILINE |
ES_AUTOVSCROLL | WS_VSCROLL |
ES_AUTOHSCROLL | WS_HSCROLL,
0, 0,
rc.right, rc.bottom,
hWnd,
(HMENU)ID_EDITBOX,
Inst,
NULL
);
SendMessage(hEdit, EM_SETLIMITTEXT, (WPARAM)(1024*64), 0);

見た目の症状としては、エディットボックスのスクロールバーが一番下までいきません
それ以上に文章があるはずなのに、スクロールバーはすでに一番下でこれ以上下にいかない。となります
もしよろしければ回避法など教えていただけると幸いです
Windowsの制限では?
スレ違いだが。
473デフォルトの名無しさん:02/04/17 01:50
>>471
Winのエディットボックスは64kbまでだと思うたが。(違ってたらスマシ)
それ以上書き込んでるってこと?
制限があるのは9x系のみ。

スクロールについては、推測だが
スクロールバーの解像度以上の行数を流し込むと当然1pxごとに
2行以上スクロールすることになり、位置とスクロールバーの(見た目)位置が同じでも
実際には幅があるってことじゃないか?
475468:02/04/17 02:04
>>469>>470
ありがと。
ポインタへのポインタだから一緒だよねぇ…
教授に注意されてチョト自信なかったから聞いてみたのです。
intの最上位ビットが立っているかを調べるのに
if( i < 0 )
とやるのはOKなんでしょうか?環境依存なく
477デフォルトの名無しさん:02/04/17 02:22
ダメだろ。
>476
規定外だと思うので、厳密には環境依存するんではないかと。
俺は見た事無いけど。
(INT_MAX + 1) >> 1
480デフォルトの名無しさん:02/04/17 02:29
 ( ΘρΘ) <私のならいつでも勃ったるが・・・
 (     )
  |   つ |
 ( _)_)
>476
unsigned intでなければOKなんじゃない?明示的にキャストしておくとか。
それとも、素直に((i<<1)>>1 == i)で調べるか。
>>472
スレ違いでしたか。もうしわけございません

>>473
57KBくらいで変になってしまうのです
64ならなっとくなのですが、どうも中途半端で??です

>>474
なるほど
しかしちょっといじってみたところ
・一番下までスクロール(バーは一番下だが文章はもっと続いてるはずなのに)
・改行する
とやると、一番下までちゃんと表示(バーも正常になる)のです
Windowsの制限でしょうか…

アドバイスありがとうございます
>>476
最上位ビットを調べるのに0より小さいかみるのは正直お勧めしない。
ビット演算子使うべき。
環境依存なし=int幅が不定
という状況で、ビット演算子をどう使う?
485デフォルトの名無しさん:02/04/17 03:34
>>481の2行目の方法を使えということでは。
環境依存なし
という状況で、最上位ビットを何に使う?
signedならば負かどうか、unsignedなら>>481で桶では?
signedでもunsignedでも、キャストしちまえば片方で済ませられるな。ヤター
念の為、>>481にvolatileつけとけば確実かな。環境によっては最適化間違えるかも。
>>488
intからほかの型に仕様変更されたら(以下略
どちらにせよ最上位ビットってのは汎用性が無いよな。
何番目のビットか明示的に示すべきなのに。
条件演算子?:でしかできたいことってありますか?
>>491
?:は右辺値になれます。
if();else;は値を持ちません。
>>434
while("無限ループだよ")

これが一番わかりやすい。メモリの無駄遣い?
>>492
そうなのか、ありがとう。
495デフォルトの名無しさん:02/04/17 06:06
ありがとうage
>>484
intの幅なら CHAR_BIT * sizeof(int) で出んか?
497麗恵香:02/04/17 07:54
魔法のiらんどでつくったHP不正に改ざんされてパスワード変えられた。
誰か不正アクセスの仕方とか教えてください。お願いします。
>>493
それいいな
499デフォルトの名無しさん:02/04/17 08:57
イイカ? w
500デフォルトの名無しさん:02/04/17 08:58
500get!
>>496
intのビット数はCHAR_BITの整数倍とはかぎらないというワナ
>>501
整数倍だが?
いや、正確にはsize_t倍か。
size_tって実数でもいいんだっけ?
503ぼうようマンセー:02/04/17 10:06
おい!お前ら!
プログラミング言語C(K&R)なんてどこにも売ってないじゃないか!
古臭い本紹介しやがって、だましたな!1は謝罪しる!

# 漏れは某アンチK&Rスレの1ではありませんが、
# 今までいくつかの本屋を回ったがマジでK&Rはどこにも売ってねぇ。
# ネットで買うのもいいかもしれんが、そんなマイナーな本には期待できねーな。
読んでもお前にはわからんから安心しろ。
>>504
SunKAMATAの本屋にはあった。
K&Rをマイナー呼ばわりするヤツ初めて見た。
どこを突っ込んでいいのかわからん。
ケツに突っ込め!
509日下部陽一:02/04/17 12:33
> 古臭い本紹介しやがって、だましたな!1は謝罪しる!

ごめんなさい。
作ってわかるCプログラミングのほうをどうぞ。
>>476
これじゃだめ?

#include <stdio.h>

int wordlength(void);

int main(){

    int int_len;
    int i;

    int_len = wordlength();

    if(0 < (i >> (int_len - 1))){
        printf("(゚∀゚)!!\n");
    }else{
        printf("(´・ω・`)\n");
    }

    return 0;
}

int wordlength(void){

    int i;
    unsigned int v;

    v = (unsigned int)~0;

    for(i = 1; 0 < (v = v >> 1); ++i){
        ;
    }

    return i;
}
511デフォルトの名無しさん:02/04/17 12:37
アヒル本マンセー
512デフォルトの名無しさん:02/04/17 12:45
K&Rをクソと認めない老人ホーム集団のスレはここですか?
K&Rを読めないからやつあたりしちゃってる厨房がまぎれこんだというスレは
ここですか?
>>512
訳に関してなら言いたいことは沢山あるが、
内容に関しては年代など関係なくスバラシイ。
>>512
カーニハンとリッチーには足を向けて寝れませんが何か?
アオラーは相手にしないように。
>>504
> プログラミング言語C(K&R)なんてどこにも売ってないじゃないか!
確かに1版はどこにも売ってないね。(緑色の表紙の奴)
古臭い本だからね。
518デフォルトの名無しさん:02/04/17 13:08
K&Rも英語で読めないアフォがあつまるスレはここですか?

般若心経2002の校訂作業をしているスレはここですか?
520デフォルトの名無しさん:02/04/17 13:55
はい、ここです。
521ぼうようマンセー?:02/04/17 14:15
>>503
例えだからいいにしても、int型が12ビット?ありえねぇ。
http://www.bohyoh.com/CandCPP/FAQ/FAQ00046.html

それはともかく、int型で sizeof(int)*CHAR_BIT を使い切らない
処理系があってよいということか?ほう。
>>521
言われてみれば12ビットってのはおかしいな。
31ビットとか半端なintもありえるってことだな。
CHAR_BITが9で、intが32ビットとかもありそう。
そういうイビツな処理系にお目にかかりたい。

最近はWintelマシンばっかいぢってる。
int i,j;
for(i=0; i<5; i++){
for(j=0; j<3; j++){
printf("iは%d:jは%d\n",i,j);}
}
return 0;
↑の説明で外側のループを1回処理する事に、内側のループは3回
処理されています。、と、書かれていたんですがなぜ外が1回しか
処理されてないのに、内側は3回も処理されるんでしょうか?
>>525
3回ループしてるって事だろ?
>>517
第1版の表紙は緑じゃなくて白だよ。
ANSI C規格が出来る前なので、内容的には相当古いですな。

コンピュータ関連書籍の中でも異例なほどのロングセラーで、確か
第100刷以上行ってたはず。これの初版第1刷とか持ってたら自慢できるかも。
528デフォ七:02/04/17 15:29
register 変数にmemsetで値を書こうとすると警告が出るのだが・・・
レジスタのアドレスは取得できません
だってさ。
一応実行ファイルはできてるようだが怖い。
これって大丈夫なのか?
ちなみにSolaris7&Sunのccコンパイラです。
>>525
内側は最終的に5×3=15回処理されます。
>>527
いや、そりゃそうだろ・・・・C++じゃないんだから。
>>528でした。スマソ。
C言語ではregister変数のアドレスは取れないよ。C++ならOKだが。
>>528
指定通りにレジスターにおかれたらまずいんじゃない?
よくわからないけど。

しかし配列をレジスターにおくのはいかがなものかと・・・
533デフォルトの名無しさん:02/04/17 15:33
>>531
C++ではregisterをつけてもアドレスを取ろうした場合は必ずメモリー上にデータが配置されるの?
>>524 全て32bitって処理系をやっています CHAR さえも
>>534
1byte=32bitなの?
charが大文字なのが気になるけど・・・
>>531
必ずというか、register指定が無視される。
>>526
外のforの処理をしたら、内のforの処理が起きますよね。
そうした場合jの値が増えてjが2の時、処理が終わると思うんですが
外のforの2回目の処理の時もまた、内側のforも処理され始めたんで
す。1回目でjの値は2になったのに、何でまたj=0の状態から始まるの
かがわかんなかったんです。
説明下手ですいません。
>>533
アドレスを取る所ではメモリ上から取るが、最適化によってレジスタ変数
が使われる場合もある。
539535:02/04/17 15:42
>>535 メモリアドレス単位が32bitなので char も32bitです
>>537
jが3の時、処理が終わる。なぜまたj=0から始まるかというと、
for(j=0; j<3; j++){
~~~~
ここでjに0を代入しているから。
541デフォルトの名無しさん:02/04/17 15:43
>>537
jが3の時に処理が終わる。内側のループを抜けるからプリントはされないが。
CHAR_BIT == 32
sizeof int == 1
>>537
デバッガの使い方おぼえて、変数の内容を確認しながらステップ実行してみ
なされ。
544537:02/04/17 15:46
>>540 >>541
なるほど、わかりました。jが2になった時点でj=2が
記憶されるものだと思ってました。
>>537
> 何でまたj=0の状態から始まるのかがわかんなかったんです。
そういう処理を書いているから

多分、for(j=0; j<3; j++){
をfor(; j<3; j++){
に変えたら君の期待した動作になるはず。
>>537

int i,j=0;
for(i=0; i<5; i++){
for(; j<3; j++){
printf("iは%d:jは%d\n",i,j);}
}
return 0;

これでやればきっと思い通りになる。
547537:02/04/17 15:48
>>543
デバッガですね。まだ、C初めて3日目なんでこれから
覚えようと思います。有り難うございます。
548デフォルトの名無しさん:02/04/17 15:49
>>534
float と double は?
>>546
試してみます。
550デフォ七=528:02/04/17 15:51
そうか、register変数のメモリは取得できんのか…
thx
memsetをやっちゃった場合には処理系依存になるのかしらん。
普通の自動変数に変更されてるのかなぁ?
このへんの動作をprintfで吐かせるにはどんなコード書けばいいのか?
>>549
きっとコンパイラに「警告:初期化されていない変数jを参照しようとしました。」と言われるな。
今時registerなんて書かないもんだ。
>>550
register変数というか、レジスタにアドレスがないから取得できないんじゃないの?registerをつけたからといって必ずしもレジスタに置かれるというわけではないけど。
554534:02/04/17 15:57
>>548 floatもdoubleも32bitです。 レジスタ内では実数部32bitの40bitあるんですけどね。
555デフォ七=528:02/04/17 16:00
>>553
>>552
それは理解できてますよ。
ただ、古いコードをお守りしてる都合上、どうしてもregister変数に
memsetをしてる場合の動作を知りたいんですよ。
>>555
エラーにならずに警告にとどまっているなら、register指定は無視され、
メモリに割り当てられているんでしょう。
>>551
> きっとコンパイラに「警告:初期化されていない変数jを参照しようとしました。」と言われるな。
なぜ?jは定義したときに初期化されているように見えるが?
556に1票。
警告が気になるなら
 #define register
とでもしる。
559551:02/04/17 16:09
>>557
悪い。549のレス先を見間違った。
私は>>546>>545とかぶったから、てっきり549は>>545を参考にすると言ったのかと思ったよ。
register てつけることは、コンパイラに対して
「気が向いたらレジスタに割り当ててほしいなあ」
とこちらの意向をお伝えしているにすぎないのでぷ。
何かを保証するようなキーワードではありませんでぷ。

コンパイラはそんなことはまったく無視するかもしれないし、
(可能なら)親切にもそうしてくれるかもしれないし。
>>560
そうなのだが、register変数のアドレスを取ろうとすると、
「さっきレジスタに割り当てて欲しいと言ったのに、なぜアドレスを今更
取ろうとするの?(゚Д゚)ハァ?」というようにコンパイラがだだを捏ねます。

C++なら、「さっきはregisterと言ったけど、アドレスを取りましたね。
ではregister指定は無視しましょう。」となります。
0ページをレジスタ変数に使っているという罠
>>562
CPUは65xxxですか?
というか、0ページも所詮はアドレッシングモードの一つに過ぎないしなあ。
レジスタの極端に少ないCPUでregister指定をしても意味がないかも。
x86もレジスタは少ない方だが、レジスタリネーミングのお陰で結構効果
があがる。
>>561
それは、あなたのコンパイラがそういう仕様なのであって、
全部のコンパイラがそうなのとは違いまぷね。
警告レベルのようなオプションの設定によっても
やかましさは違うでしょうし。

>>562
つまらないでぷ。
>>564
ANSI-Cでregisterと宣言された変数のアドレスは明示的にも暗黙的にも
取れないと、K&R第2版A8.1に書いてありまぷね。
だからなに?
>>566
コンパイラによって、registerのアドレスを取ろうとした時、
エラーにならない処理系は標準ではないのかと小一時間。
568デフォ七=528:02/04/17 18:06
>>565
そのようですが、現実のところは処理系依存ですね。
SunOS4.1.1のccだと通してしまってるみたい。
>>565
ANSI Cも所詮は規格のひとつにすぎない。
すべてのコンパイラがANSI C準拠だと思うな。
>568
古っ
規格の関係で間違い指摘されると、
規格外のコンパイラもあるって言い出すやつが必ずいるな。
そんなこと言ってたら規格の話題は全部無意味になるよ。
>>571
> 規格の話題は全部無意味になるよ。

そんなことないだろ。
>>565はANSI-Cが全てだというような書き方をしているのが悪いんだ。
573デフォルトの名無しさん:02/04/17 18:45
今さらって感じですが明解C言語_入門編を購入したのですが
そこでどうでもいい疑問があるので質問させて頂きます。
いままで"return 0;"としてmain関数を締めてたのですが
この本では"return (0);"となっています。
結論としてはどちらでも良いのでしょうが
微妙な違いみたいなものってあるのでしょうか?
return(0)は、retrun(0)のとき(特にCで)
かな〜りしぬるので、おすすめできない。
a = 0; と a = (0); がどちらでもいいのと同じくらいどちらでもいい。 returnに括弧を付けると関数呼び出しっぽく見えてしまうので、個人的には 付けない方が好みだな。
576デフォルトの名無しさん:02/04/17 18:50
>>573
某書籍には括弧はつけてもつけなくてもよいと書かれています。
577デフォルトの名無しさん:02/04/17 18:50
> ANSI-Cが全てだというような書き方をしているのが悪いんだ。

そんな書き方はしてないだろ。
規格外のコンパイラの話をするんなら、そういう前提でやってくれよ。
578教えて君:02/04/17 18:55
文字列を入力して文字列を逆にする関数の作り方を教えてください。
例)ABCD→DCBA
char *strrev(*char *str)
char *str 対象となる文字列。
リターン値 文字列の先頭ポインタ。
こんな感じでどなたか教えてください。
>>577
つまり多くのコンパイラはC99はサポートしていないので
「規定外のコンパイラ」と一々付けなければいけないのですね?
>>578

char *strrev(char *str)
{
int i=0,j;
char t;

j=strlen(str)-1;
for(;i<j;i++,j--){
t=str[i];
str[i]=str[j];
str[j]=t;
}

return str;
}
581580:02/04/17 19:04
intじゃなくてsize_tの方がよかったか。どうでもいいが。
582教えて君:02/04/17 19:07
>>580
あんがとです!!
助かりました♪
>>580
int main(void)
{
  printf("%s\n", strrev("ABCD"));
  return 0;
}
あり、core dumpするぞ?
# こんな使い方する方が悪い?
584デフォルトの名無しさん:02/04/17 19:08
>>574,575,576

レスありがとう。
結論としてはどちらでも良いが、括弧で括らない方が
一般的なのですね。
これからは今まで通り括弧付けずに逝きます。
>583
strcat("abc", "def");と同程度には。
>>583
あれ?なんか間違った?(汗
# 文字列リテラルを書き換えようとしているからじゃないよね?
>>585
つぅか彼は何がしたいのでしょうか?
>>586
文字列リテラルを書き換えようとしてるじゃん
>>583
あなた、

int *a = 32;

とかして平気な人?
>586
VC6だが"ABCD"はwrittenになれんそうです。

"0x00401086"の命令が"0x00420020"のメモリを参照しました。
メモリが"written"になることができませんでした。
591なわけねーだろ:02/04/17 19:33
>>589
アドレスのハードコーディングマンセー
592デフォルトの名無しさん:02/04/17 19:40
数値を入力して16進文字列を作成したいんっす。
でも%xは使用禁止なんですよ(涙
アドバイスください。
おながい
ハッキリ言ってインターフェースが悪い。
char *strrev(char *str);
ではなく
char *strrev(const char *rev, char *str);
とすべきと言ってみるテスト
>>593

×:char *strrev(const char *rev, char *str);
○:char *strrev(char *rev, const char *str);
>>592
65536でわる256で割る16で割る。
>>592
itoaと言ってみるテスト
>>592
%xがだめなら%Xを使え。
>>592
宿題は自分でやれ。
>>592
//テーブル。頑張って作ってね。
char s[][]=("1","2","3",......,"FE","FF".....);

int main(int argc,char **argv)
{
int input;

scand("%d",&input);

printf("%s",s[12]);
}
>>592
> 数値を入力して16進文字列を作成したいんっす。
テーブル作れ
char *hextbl[9] = { "0", "1", "2", "3", "4", "5", "6", "7", "8",
"9", "A", "B", "C", "D", "E", "F", "10", "11", "12", ...
   :
   :
"FFFFFFFC", "FFFFFFFD", "FFFFFFFE", "FFFFFFFF" };
使い方:
int dec = 1234;
printf("dec:%d hex:%s\n", i, hextbl[i]);
ただし、プログラムサイズがやたらでかくなる諸刃の剣
正直、599がchar *s[]ではなく、char s[][]で、しかも("","")という
珍妙なる初期化を行うのはなぜだろうか、と疑問に思う。
600には、
>char *hextbl[9]
をもう一度よく考え直していただきたい。
>>592
宿題まるなげ禁止。
どこまでできて、どこでつまずいてるのかを明記し、

宿題、手伝おっか?
http://pc.2ch.net/test/read.cgi/tech/1011722640/

こちらへ。
テーブルを手で入力してると打ち間違いが起きるから、プログラムに作らせようよ。
int main()
{
int i;
printf("char *hextbl[] = {\n");
for (i = 0; i <= 0xffffffff; i++)
printf("\t\"%X\", \n", i);
printf("};\n");
return 0;
}
これをコンパイル、実行した結果をファイルにリダイレクトしてプログラムに
組み込めばばっちり。

> ただし、プログラムサイズがやたらでかくなる諸刃の剣
それどころか、間違いなくメモリに入りきれませんが…。
亀レスになりますが・・・・・

>>569
> ANSI Cも所詮は規格のひとつにすぎない。
> すべてのコンパイラがANSI C準拠だと思うな。

ANSI-Cが規格化された経緯は、結局文法がバラバラになってしまい、
一つの辞書のような規格を作ろうとしたからだと思います。

だからANSI-Cが絶対正しいというわけではないですが、文法の相違
の話になると、今の所ANSI-Cにはこう書いてあったよ、という話にな
ると思います。

なぜコンパイルが通らないのか、なぜ警告がでるのか?と一人で悩む
ぐらいなら、ああ、これは標準とは違うんだ、で納得できれば、時間も
気苦労も少なくて済みますよね。
>604
ホントに実行してみた?
そのループ、回らなはずだけど‥‥
>>606
回らなはずだけど‥‥
608604:02/04/17 20:11
あ、すまん。int i;じゃなくてunsigned int i;じゃないと。
>>604
それから%Xは使用禁止なんよ。
>>606
ホントに実行してみた?
そのループ、回るけど止まらないんだけど・・・
unsigned intは32bit どの環境でも?
612604:02/04/17 20:22
ううむ。0xffffffff -> UINT_MAX ですか。
char format= "%%";
format[1]='X';
printf(format,i);
激しくつまらないな‥‥

>604
"FFFFFFFE",
"FFFFFFFF", //←コンパイルエラー
};
614604:02/04/17 20:27
>>613
最後のカンマが余計なのはエラーにならないんじゃなかったっけ?
シマッタ、それが有効なのはenumだけだとオモテタ‥‥
>>613
最後のカンマはエラーにならないよ。
C99とC++ではエラーにならないけど。
618613:02/04/17 20:32
よし、ここは、569の例に倣って、
「エラーになる俺様コンパイラがある」ってあたりで(自爆)。
つぅかあんたらいい加減にテーブル引きとかバカなこと言わず(発端は俺だが。)。
>>619
馬鹿なことじゃないぞ。
16進数化程度では確かにくだらないが、汎用性を考えると(以下略
いややはり、事実上コンパイルできないのは大きいから、
DBなり、固定長のファイルレコードなりに納めるのが
実用的だと(以下略)
確かに、この程度の処理で巨大なテーブルを引くのはよくないな。
こうしよう。
int dec2hex(int x)
{
FILE *fp = popen("bc", "w");
fprintf(fp, "obase=16\n%d\n", x);
pclose(fp);
}
int -> void
>>622
これがCじゃなくてシェルスクリプトだったらUNIX的なすばらしい解決法だね。
s[i++] = (t=n%16)>9 ? t-10+'A' : t+'0' ;
前後を組み立ててloop!!
626デフォルトの名無しさん:02/04/17 21:48
制御文字ってどんなのですか?
>>625
コードがEBCDICでも大丈夫かな?あれはA-KとL-Zが分かれていただけ
でしたっけ。
629デフォルトの名無しさん:02/04/17 22:03
アスキーコードの奴だったんですかどもありがとうございます>>628
630デフォルトの名無しさん:02/04/17 22:43
なんかスレ違いかもしれませんが、
フリーウェアでおすすめのCコンパイラを教えてください
ちなみにwindowsMEでも動くやつをお願いします
>>630
borland。C++だけど。それかgcc。C++だけど。
634デフォルトの名無しさん:02/04/17 22:58
>>631-633
レスありがとうございます。
グーグルで検索したときに出てきたLSI-cとかいうのはMEでも動くのでしょうか?
95と98としか書いていなかったので。
>>634
うごくよ。でもLSI-C試食版はおすすめせん。制限が大きすぎるし、ANSIから
外れている点が多過ぎる。(wchar_tに対応してないなど)
636デフォルトの名無しさん:02/04/17 23:11
>>635
丁寧に教えていただきありがとうございます。
LSI-cはおすすめではないのですか。う〜ん
ちなみに私は今C言語の猛特訓中でありまして、
コンパイラ使うのもポインタとか構造体とかのそこら辺の部分を実際に
動くところを確認したかっただけなんです。

もうちょっと色々調べてみます。
何かスレ汚してすみませんでした。
637デフォルトの名無しさん:02/04/17 23:11
男は黙ってCygwin + GCC = (・∀・)イイ
>>636
だったらなおさらLSI-C試食版はやめた方がいいぞ。
構造体を正しく返せないなどのバグがあるから。
LSI-C試食版にはお世話になったが、今では論外。
GCCかBORLANDにしとけ。楽だし。
LSICのマニュアルは持ってて損はないけどな
>>633のは初めて知ったけどどうなの?
使ってるひといるのかな。
642デフォルトの名無しさん:02/04/17 23:43
円の書き方教えて
ドラえもんに聞け
printf("円");
printf("\\");
gccやBorland-C++でも、正しく書いたCプログラムならコンパイルできるぞよ。
printf("○");
>>642
奥村晴彦氏のアルゴリズム本より。
http://www.matsusaka-u.ac.jp/~okumura/algo/

void gr_circle(int xc, int yc, int r, int color)
{
int x, y;

x = r; y = 0;
while (x >= y) {
gr_dot(xc + x, yc + y, color);
gr_dot(xc + x, yc - y, color);
gr_dot(xc - x, yc + y, color);
gr_dot(xc - x, yc - y, color);
gr_dot(xc + y, yc + x, color);
gr_dot(xc + y, yc - x, color);
gr_dot(xc - y, yc + x, color);
gr_dot(xc - y, yc - x, color);
if ((r -= (y++ << 1) - 1) < 0)
r += (x-- - 1) << 1;
}
}
649デフォルトの名無しさん:02/04/17 23:55
マイクソソフトのVC++6.0使ってCのプログラミングするときどうやるの?
650デフォルトの名無しさん:02/04/17 23:56
Cの文法って、lexerが型名と識別子を区別してやらないと
LALR(1)にならないんでしょうか?
>>649
>マイクソソフト
質問してるやつが2ちゃん言葉使ってるとむかつくから教えない。
>>649
ファイルの拡張子を".C"にするとか言ってみるテスト。
>>649
cl hoge.c
これ最強。
654デフォルトの名無しさん:02/04/18 05:00
う〜ん ポインタと配列で質問なんですが。

char a[] = "hogehoge";
char *b = "hogehoge";

a[0] = 'z';
b[0] = 'z';//これを書くと例外で落ちます。

この差がわかりません。
ポインタの初期化ではメモリを確保したことにならないんでしょうか?
>>654
b[0]='z'は文字列リテラルそのものを書き換えようとしているからエラーになる。
a[0]='z'は文字列リテラルを使って初期化した配列の要素を変更しようとしているだけだから問題ない。
657デフォルトの名無しさん:02/04/18 08:11
656の説明でわかるかな?

文字列リテラルは文字が配列として並んでいる定数でそういう意味では5, 'a'
などと同じ。
int x = 5; char ch = 'a';に対して
x = 10; ch = 'b';なんてやるのは全然問題ないけど 
5 = 10 ; 'a' = 'b'なんてやるのはエラーになって当然。
しかし世の中には定数を読み書き可能領域に割り当てたりするコンパイラもあるので
654のコードがエラーにならない場合もあるらしい。
>>657
constで宣言した変数と似た様な扱いなのね。
>>654 (3番煎じ(?)だけど、せっかく書いたのでカキコんどきます)
例外で落ちるとは、すばらしいね。
OSとコンパイラによっては、無視してそのまま実行され、
両者の違いに気付かないまま先に進んじゃってたかも。

char *b = "hogehoge";

の場合、「hogehoge」という文字は、自動変数を確保するスタックとも、
malloc()したときに使われるヒープとも違う、読み出し専用メモリ領域に
埋めこまれています。なので、書き換えるとメモリアクセス違反になります。

これに対し、

char a[] = "hogehoge";

は、疑似的に書き直すなら

char *hogehoge_ptr = "hogehoge"; /* これは上の b の例と同じ場所を差している */
char a[strlen(hogehoge_ptr)+1]; /* スタック上にhogehoge(8文字) + '\0'(1文字) の配列確保 */
strcpy(a,hogehoge_ptr); /* 配列にコピー */

となり、a はスタック領域を指しているので、書き換えOKです。

「セグメント 文字列リテラル」で検索したよさげなページを貼っときます。
http://www.mars.dti.ne.jp/~torao/program/general/memory.html
>>654
char b[]="hogehoge";

char b[]={'h','o','g','e','h','o','g','e','\0'};
と完全に同値な不規則な構文。このとき"hogehoge"は
文字列リテラルでは全くない。
661デフォルトの名無しさん:02/04/18 11:00
円のプログラム教えて
>>661
お前、↑で書いてくれた奴に土下座して謝れ。
関数の修飾子にpascalをつけるとどーなるんですか?
>>663
8086の時代にはちょっとだけ効率がよくなった。
最近のヤツはしらん。
665MS-Cユーザ:02/04/18 11:48
>663
引数を左から順にスタックつんだはず。
可変長引数のprintfとかの動作は知らん。
>664
win16の時代には… では?
>>665
> win16の時代には… では?

win16も俺にとっては最近。
667MS-Cユーザ:02/04/18 12:32
>663
#include <stdio.h>
void write( char * str )
{
printf(str);
}
pascal program main();
begin
write('Hello Pascal!');
end.

を期待してた?
>666
...
>>665
加えて、pascal呼び出しは、パラメータをスタックに積んだ場合、呼び出し先
で元に戻す。C呼び出しは、呼び出し元で元に戻す。
RISCなどのレジスタにパラメータを持って呼び出す場合はそんなに変わらない。
pascal呼び出しは、スタックの調整のコードが呼び出し側から無くなるぶん、
コードサイズが小さくなるってこった。
pascal の方がサイズは増える気が。
671デフォルトの名無しさん:02/04/18 17:51
Winmain()からDialogBox()を呼び出してリソースエディタで作ったダイアログボックスを表示
するのですが、表示座標を決めたいです。(左上に表示されてしまう)
どうにか方法はありませんか?
>>671
>>457の2つめのリンク
673デフォルトの名無しさん:02/04/18 18:00
char str[] = "あ"; //"あ"のシフトJISでのコードは 0x82a0
USHORT code = (str[0] << 8) + str[1]; //値は33184 = 0x81a0
なんで値が違っちゃうんですか??
>>673
char が符号付きの環境の場合、str[1] == 0xa0 はマイナスの数として
扱われて、結果 USHORT( 0xffff8200 + (-0x60) ) == 0x81a0 に。
+0xa0 として使いたいなら unsigned char にするなり &0xff するなり。
>>673
unsigned charにしる!
676673:02/04/18 18:15
>>674-675
(UCHAR)tnx;
>>676
WindowsだったらMAKEWORD()ってマクロがあるから
それ使ったほうがスマート。
678676:02/04/18 18:23
(UCHAR)MAKEWORD();
679デフォルトの名無しさん:02/04/18 18:26
Timerの識別ってどうするんですか。
>>679
WindowsならIDで識別。
>>679
つーか全然Cと関係ないしAPIすれ逝けと小一時間(以下略)
>>681
確かに、最近純API系の質問多いね。
今後は放置の方向で。どうしてもかわいそうなら誘導でよろ。
683デフォルトの名無しさん:02/04/19 02:01
いろいろな言語を見てきてたどり着いた結論なんですけど、
Cはただのマクロに過ぎないという考えであってるでしょうか。
C++などに比べるとあまりにしょぼいですが、
こう割り切ってしまうとだいぶ開発が楽になります。
すみません、初心者なんですが、
double a = 0;
double b = 0.0;
これって違いがあるんですか?
685デフォルトの名無しさん:02/04/19 02:08
>>683
どこが?
>>683
マクロを拡大解釈していけばあらゆる言語がマクロに見えるだろうね
687デフォルトの名無しさん:02/04/19 02:20
>>683
ハァ?まるでJava房かのような発言だな

>>684
無いよ。
>>685
ちょっとしたプログラムを書くのには悪くないって感じです。
少し大きめの物を作るのには使いたくありませんけど。
>>686
非OOPLはすでにみんなマクロに見えてます。

>>687
JAVAはやりません。遅いから。
684です。
>>687
どうもです。PascalやってたんでどうもCの実数と整数の扱いにしっくりきません。
int i = 5/3;
とかできるあたりとか…。
691デフォルトの名無しさん:02/04/19 02:29
>>688
>使いたくありませんけど
Cを使いこなせないってことね(プ
692デフォルトの名無しさん:02/04/19 02:32
>>689はOOPLにとり憑かれています
さっさと病院に逝きましょう
693デフォルトの名無しさん:02/04/19 02:36
というか、Cがわかってねぇんだろ。
VCのウイザードが生成したプログラム見て、OOPすげぇー、とか逝ってるだけ。
>>689が言うJavaが遅いというのは、

1 ゲームや数値計算など、処理速度が重要なソフトを開発している
2 Javaが遅いと思いこんでいる
3 頭がどうかしていて、糞遅いコードしか書けない

上記のうちどれでしょう?

言語を並べてガタガタぬかすのがそもそも(以下略)
ここはCしかわからない老人のスレですか?違いますよね。
Cを理解し、C++を理解していれば、Cの生産性がC++に比べてはるかに低いことは認識できると思いますけど?
もちろん、C++を使いこなせないプログラマの場合この限りではありませんが。
漏れの場合は、大部分のOOPLの方がマクロに見えるけどな、
というか、書いていて生成されるアセンブリコードが想像できない言語は全部。

つか、>>689が言うマクロって何だろう。
>>696
生産性の定義を述べてみ。
またCとC++の生産性をどうやって測定したのかも述べてみ。
それぞれ幅広い分野での実装例について比較可能な形で調べにゃならんわな。
まさか、定義も測定もなしに生産性がどうたら言うてるんじゃあるまいね?
まして、自分ひとりの経験でどうたら言うてるんじゃあるまいね?
>>694
1です。
700デフォルトの名無しさん:02/04/19 02:55
>>696
だからと言ってC = マクロということにはなりません
ちゃんとC/C++理解してんの?あんた
>>689が使ってる言語って何だ?
非OOPLがマクロに見える(ほめ言葉じゃないわな)って言うぐらいだから、
よっぽどOOPにこだわりがあるようだが、C++みたいなOOPLとしては
おもちゃ以下のものしか使ってないって事はないよな。

EiffelとかSmalltalkでもつかってんのか?
702デフォルトの名無しさん:02/04/19 03:01
すげーカメラ目線だ
つーかここは C のスレであって C++ やら OOPL やらのスレじゃないんだが。
        ∧_∧
        ( ´Д` ) Σ スマソ >>702は誤爆・・・
       /,  /
      (ぃ9  |
>>697
一連の作業をあらかじめ一つにまとめて自動で実行するためのもの、
という意味で使用しています。
拡大解釈すれば、当然すべてのプログラムはマクロと取れます。

>>698
この話はすでに他のスレで何度もされているようですが。
この場合は同様のものを実装するのにかかる時間、
といったところでしょうか。
判断基準はいろいろあるでしょうが、
重要なことは、C++はCのほぼスーパーセットとなっているので
適切に判断すればどのような基準においてもCに劣ることはありません。

>>701
メインはC++です。
C++はOOPLとしては問題も多く含みますが、
そのC++ですら、非OOPLに比べたらだいぶましです。
706デフォルトの名無しさん:02/04/19 03:18
C++はいいと思うが、Cをマクロといってるお前の頭の構造が(以下略
>>705
>重要なことは、C++はCのほぼスーパーセットとなっているので
>適切に判断すればどのような基準においてもCに劣ることはありません。

別の観点から言えばC/C++の何れかで書かれたコードは
どちらもC++のコードだと言ってるように見えるが気のせいか。
        ∧_∧
        ( ゚Д゚ ) <>>705いい加減にしろよ貴様
       /,  /
      (ぃ9  |
>>707
拡張子で(以下略

もちろんそうなるでしょう。
その場合はC++で書かれた一部のスタイルのプログラムはマクロのようだ、
ともいえるでしょう。
マクロのように見えるかどうかは言語そのもので決まるのではなくてプログラミングスタイルですから。
Cで書かれたプログラムでもマクロに見えないようなのはごまんとありますし、でもそういうプログラムをCで書きたいとは思いません。
>>709
いや、そうじゃなくて。
C++で書かれたコードしか存在しないって主張の中で
CよりC++だって言うのはトートロジーチックじゃあるまいか。
そりゃ詭弁じゃないか。
とこのように言っているのだよ。
大体C++で追加されたフィーチャーの生産性への寄与については
何も具体的な言及をしとらんじゃないか。
あ、クラスの効用とかなら言わんでいいよ。
理論的に優れている、というのはどんな言語にだって言えることなんだから。
あくまでも現実のソフト屋業界における生産性を聞いておるのだ。
実証もなしに見てきたようなことばっかり言ってたら脳味噌腐るぞ?
711マジレス:02/04/19 03:35
Smalltalk >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++ > C
712Lisper:02/04/19 03:37
マクロ >>>>>>>>>>>>>>>>>>>>>>>>>>>>> C > C++
・・・いつ Ruby が出てくるのかなと期待しているのは漏れだけではないはずだ(藁
714C厨:02/04/19 03:39
C > OOPL >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++
715Ruby!Ruby!:02/04/19 03:41
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>713 > >>683
716C/C++房:02/04/19 03:44
チンコ -> Rubyist
717デフォルトの名無しさん:02/04/19 03:45
HSP>>>>>>>>>ラディソ>>>>>>Ruby>>>>>>>C++
>>716それはおかしい
Rubyist => チンコ
「Rubyistはチンコに評価される」
pc.2ch.net >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> このスレの住人
宗男 >>>>>>>>>>>>>>>>>>> このスレの住人 <<<<<<<<<<<<<<<<< 真紀子
1000!
722デフォルトの名無しさん:02/04/19 03:53
俺 >>>>>>1>>>>>>>>>>lisp>>>>HSP>>>>>>>>>>>>>>>>>>715
723デフォルトの名無しさん:02/04/19 03:54
電波=>>721
>>710
実際に完成されたプロジェクトとしてその効果を客観的に判断するのはほぼ不可能でしょうね。
でもごく小さな範囲でなら可能です。
C++でSTLを使用すれば容易に線形リストを実装し検索・分類などの操作も可能です。
Cではその場合に応じて書かなければいけません。
たったこれだけのことですが、少なくとも他のすべてでC<=C++なので、C<C++は証明できます。
>証明できます
じゃぁ、証明してくれ。
少なくとも俺にはC<C++の`証明'をすることは不可能だ
Lisp >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>722 > 神 > >>1
>>745
724で証明されていますが、ご不満でも?
>>725
文系君にとって`証明'とはいくつかの事例を集めることなんでしょ。
>>724
>C++でSTLを使用すれば容易に線形リストを実装し検索・分類などの操作も可能です。
>Cではその場合に応じて書かなければいけません。

こういうのを、

>理論的に優れている、というのはどんな言語にだって言えることなんだから。

と言って釘をさして、

>あくまでも現実のソフト屋業界における生産性を聞いておるのだ。

こう聞いたんだが、言葉の順序を変えれば詭弁も通ると思っておるんかいな?
言語の話をしているのにSTLを持ち出すのもおかしな話だと思うがね。
標準ライブラリも含めてC++だと言い張るんなら結構なことだが。
>>724
>実際に完成されたプロジェクトとしてその効果を客観的に判断するのはほぼ不可能でしょうね。
>でもごく小さな範囲でなら可能です。

これも凄いこと言っとるよなぁ。
個人的な経験で語るなとも言ったのに読めておらんのかいな。
これじゃ、「世間じゃ知りませんがボクの知ってる範囲内じゃC++は凄いんです!」と言っとるようなもんだ。
CよりC++のほうが、一人で1ヶ月くらいで書けるプログラムの生産性が高いのは、俺の実感。
ところが、人数の多いプロジェクトで、人海戦術に近くなると、Cの方が生産性高くなるんだ。
Cの方が理解してなくちゃいけないことが少ないからだろうな。
生産性なんて個別的なもんだからね。
仕様、納期、人員、環境、どれが変わっても左右される。
生産性ってキーワードで物事を一括りにするのは駄目コンサルだけにして欲しいよ。
通は道具を愛でるがプロは道具を選ぶ。そういうこった。
>>727の脳味噌はピンポン球くらいの大きさであることを証明しました。
>>728
帰納法をご存じない?

>>729
>あくまでも現実のソフト屋業界における生産性を聞いておるのだ。
その主張はよく非OO信者が持ち出しますが、1行目で書いているように完成されたプロジェクトで判断することはほぼ不可能です。
そもそも同一仕様のある程度のプロジェクトを非OOとOOのそれぞれで実装したという話しは聞きませんし、したとしてそれが必ずしも客観的な判断基準とはいえないでしょう。
ついでに言えば、非OO信者は決して、これを根拠に非OOがOOよりも優れていることを証明したがりませんね、できないことがわかっているからですが。

> 言語の話をしているのにSTLを持ち出すのもおかしな話だと思うがね。
> 標準ライブラリも含めてC++だと言い張るんなら結構なことだが。

当然です。STLはCでは実装できません。
STLはすべての状況に対応できるわけではありませんが、CよりもC++のほうが再利用性の高いことを示す1つの例とはなりうるでしょう。

Cで同様に優れたライブラリを作成したところで、それはC++でも同じように使用できるのでC固有の優れた機能とはいえません。
736731:02/04/19 04:20
>>732
え? おれ?
>>733
現実は選びたくても選べない。
738デフォルトの名無しさん:02/04/19 04:24
OOが悪いとは言わん、またC++のほうが当然Cより便利だろう。
だが、Cはマクロ、といってる根拠がわからん。
単にCを貶めたいだけか?
>>735
人の発言はよく読んだ方がいいと思うなぁ。
もし私が「C > C++」と言いたがっていると思うんなら根拠を出して欲しいね。
で、結局、実世界に即した客観的評価は自分には持ち出せないので
理論的なトピックを通じてC++はCより優れていると評価するってことでいいんかね?

>Cで同様に優れたライブラリを作成したところで、
>それはC++でも同じように使用できるのでC固有の優れた機能とはいえません。

これはC++とCを入れ替えても同じ言い方ができるね。
こういうのを詭弁と言うんじゃないかねぇ?
彼は屁理屈こき麻呂。
>>736
違う違う(藁
漏れアンタに同意してるの(藁
742728:02/04/19 04:29
>>735
> 帰納法をご存じない?
知ってますよ。というか
> いくつかの事例を集めること
は正当な`証明'であると言いたいわけですか?
もしかして文系君のいう帰納法と数学的帰納法の違いをご存じない?
>>739

> >Cで同様に優れたライブラリを作成したところで、
> >それはC++でも同じように使用できるのでC固有の優れた機能とはいえません。

> これはC++とCを入れ替えても同じ言い方ができるね。
> こういうのを詭弁と言うんじゃないかねぇ?

どこがでしょう?
入れ替えてみましょうか?

C++で同様に優れたライブラリを作成したところで、
それはCでも同じように使用できるのでC++固有の優れた機能とはいえません。

STLはどうなりましたか?
>>742
十分に数学的帰納法になっていますが?
>>744
>>724がか?
本気で言ってるのか?
だとしたらアフォ丸出しですよ?
>>743
「同じように使用できる」を記法として同等にの意と言いたい訳かい?
だったら、C++の記法が優れていることを示してもらいたいねぇ。
それとも、C++はCのスーパーセットだからと言うのなら
そういう言い方自体が詭弁ではないのかというところに答えて欲しいねぇ。

それより、↓の方に答えてもらいたいんだがね(藁

もし私が「C > C++」と言いたがっていると思うんなら根拠を出して欲しいね。
で、結局、実世界に即した客観的評価は自分には持ち出せないので
理論的なトピックを通じてC++はCより優れていると評価するってことでいいんかね?

枝葉末節を斬り返していけばどうにかなると思っとらんか?
>>746
> 理論的なトピックを通じてC++はCより優れていると評価するってことでいいんかね?

いいですよ。
私には、おそらく私以外のすべての人にも、あなたの言う「実世界に即した客観的な評価」は出せませんから。
>>747
>私には、おそらく私以外のすべての人にも、あなたの言う「実世界に即した客観的な評価」は出せませんから。

おお。やっとまともな台詞が聞けたよ。
私もそう思ってるよ。だから、

>ここはCしかわからない老人のスレですか?違いますよね。
>Cを理解し、C++を理解していれば、Cの生産性がC++に比べてはるかに低いことは認識できると思いますけど?
>もちろん、C++を使いこなせないプログラマの場合この限りではありませんが。

これは侮辱と言うんじゃないかね、と、これが私の一番言いたいところだ。
これが自分の主観であることに異はないと思うが、
なぜそんなものを根拠にして見ず知らずの住人を老人呼ばわりするのか、
説明して欲しいねぇ。
749デフォルトの名無しさん:02/04/19 04:45
生産性か。。。。
言語知らない新入社員に「Cで組め」「C++で組め」って言った時は
Cの方が覚えるの簡単なんで生産性たかいとおもうが。。。
750736:02/04/19 04:45
>>741
あ、そか、ども。
なんつか、2ちゃんって、素直に読めないクセがついちゃうからさ(^^;
>>748
私の持つ根拠とあなたの欲している根拠が異なる点に基づいているだけですが?
私にとっての(あなた風に言えば理論的な?)根拠はあなたにとって根拠とは呼べないのでしょうし、
あなたにとっての(実践的な?)根拠は私にとっては根拠とは呼べない。
それだけのことです。

> これは侮辱と言うんじゃないかね、と、これが私の一番言いたいところだ。

もちろんです。
ちなみに老人呼ばわりしたのは、
C++を知らずにCとC++の比較を非難する人たちであり、
もしいるとすれば私にとっては十分に侮辱の対象になりえます。
あえて言うなら>>691-693あたりを想定していますが、
その人たちがC++を使えているなら問題ありませんし、
そもそも先に侮辱しているのはあちらです。

C++を理解したうえで、CがC++よりも生産性が低くないと主張するならば、そう根拠を持って主張すれば言いだけのことです。
私はそれらの人に対してなんら侮辱するつもりはありません。
752デフォルトの名無しさん:02/04/19 05:05
>そもそも先に侮辱しているのはあちらです。
始めにおまえがCをマクロなどと言わなければこんなレスはつかない。
753デフォルトの名無しさん:02/04/19 05:06
ヘッダーファイルに関数を書くのは基本的にはやらないほうが
いいんですよね?
>>751
>私の持つ根拠とあなたの欲している根拠が異なる点に基づいているだけですが?
>私にとっての(あなた風に言えば理論的な?)根拠はあなたにとって根拠とは呼べないのでしょうし、
>あなたにとっての(実践的な?)根拠は私にとっては根拠とは呼べない。

つまり君は君以外の人間に話が通じるとは端から期待してないわけだ。
だとしたらなんでわざわざ喧嘩しにくるのか、愉快犯かと疑ってしまう。

>あえて言うなら>>691-693あたりを想定していますが、

の割にはまるでスレの住人を一括りにしたような言い方だよ、あれじゃ。
もうちょっと言葉づかいぐらい考えてもらいたいねぇ(ニガワラ

>その人たちがC++を使えているなら問題ありませんし、

これも人を侮りすぎだと思うねぇ。
君の言う「C++が使えない」人間は多いだろうが
君がここで言葉を交わすプログラマもそうであるという保証はどこにあるね?

>C++を理解したうえで、CがC++よりも生産性が低くないと主張するならば、そう根拠を持って主張すれば言いだけのことです。

CはC++に常に劣るわけではない、という証明がここでは重要だと言うのかね?
だとしたらそれは、君の思い上がりだ。
誰もそんな話をここでしたいとは思っておらんよ。
ここはCの話をするスレだ。違うかね?
知らないやつをバカにするのは好きじゃないけど、
知らないことを自覚してないやつは、おおいに侮辱するべき。
756デフォルトの名無しさん:02/04/19 05:09
753が微妙にカワ(・∀・)イイ!
>>753
ヘッダーはインターフェースと実装の分離のために使うのが基本だからね。
ヘッダーに実装を書いてしまうと実装の変更の度に不要であるはずのコンパイルが発生してしまう。
>>751
>>691-693なんて相手にすんな。
お前もアホだが>>691-693はお前とは比べ物にならないくらいアホだ。
うぃ〜す。アホはぼちぼち寝ますわ(藁
ん?またC叩き祭りがはじまったの?
761753:02/04/19 05:59
Linuxのソースコードにはide.hなんかに関数が書いてあったりして
ちょっとCプログラミングの(自分の考えていた)常識を覆されました。

もっと勉強します。
762デフォルトの名無しさん:02/04/19 06:08
>>761
書いてありません。
763753:02/04/19 06:16
>>762
2.5系のには入ってるんですよ。
いづれ取り除かれるのかもしれないですが。
お前の意見だとノイマンコンピュータはマクロだな。と遅レス。
>>763
ソースの記述に拘るなら*BSDをどうぞ。
Linuxはそういうもんだと思って付き合うのがよろし。
766デフォルトの名無しさん:02/04/19 07:19
>>765
どこで落とせるんですか?
ファイルに直リンクでお願いします。
ハァ??
768デフォルトの名無しさん:02/04/19 07:32
ハァ???
>>767
bz2とかになってると勘違いしてる人っぽいですな。
>>769
bz2とかになっていないと勘違いしてる人っぽいですな。
C++のクラスやらテンプレートやらの記法は結局のところCに変換されるマクロですとか逝ってみるテスト
>>771
いつの時代の話をしているの?
>>771
しつこい
たまにカーネルMLにもC++房が出現するよなw
>>683-771
みんな元気だねえ
元気ですかー!

元気があればなんでもできる、、
>>705
JIS X 0015 でも読んでおけ厨!
778デフォルトの名無しさん:02/04/19 11:42
ttp://hp.vector.co.jp/authors/VA000092/jokes/strup.html
一応こういうページをリンクしてみよう。
もちろんこの文章はジョークだけどC++にはこういう一面があると言うことはC、C++
両方をかじってみて自分でも実感したことでもある。

ただしCとC++とどちらが優れているかなんて言う議論はナンセンスだと思うよ。
CにはCの良さがあるしC++はそれで優れた点もある。しかし両者とも欠点はある。
いつも言われることだが銀の矢は存在しない。優れたプログラマはどちらでもそつなく
仕事をこなすがヘボはどっちでもヘボ。
たまに、っつーかよくいるんだよね。
XはYより優れているということをYしかしらない君たち原始人に教えてやろうって態度の奴。
インドに「近代的教育」を施したイギリス人の再来かと見紛える(ワラ
しかもまた習いたての若いのに多いのが頭の痛い話で・・・。
780デフォルトの名無しさん:02/04/19 12:58
整数から文字列に変換する関数ないですか?
>>780
printf じゃ駄目?
>>780
ちょい訂正。
sprintf じゃ駄目?
783デフォルトの名無しさん:02/04/19 13:02
>>781
ファイルに出力したいの
784まじれす:02/04/19 13:03
>>780
sprintfを使おう

char hoge[128];
int num = 123;
sprintf(hoge,"%d",num);
みたいに
785デフォルトの名無しさん:02/04/19 13:03
>>782
それだと変なコードになるのでは???
786だったら:02/04/19 13:04
fprintfはどう? >>783
787デフォルトの名無しさん:02/04/19 13:04
>>784
逝けるんですね、782すまん
788デフォルトの名無しさん:02/04/19 13:12
#include<stdio.h>

void main(void){
FILE *fp;
int num=1;
int input;
int i;
char h[4];
scanf("%d",&input);
fp=fopen("t.txt","w");
for(i=0;i<=input;i++){
if(i%25==0){
fputs("\n",fp);
}
fputs(">>",fp);
sprintf(h,"%d",i);
fputs(h,fp);
}
fclose(fp);
}

直してくれちょ
/*int num=1;*/と
/*char h[4];*/と >>786 以上
790デフォルトの名無しさん:02/04/19 14:05
788
何をどう直せと。

void main(void) => int main(void)
で最後にreturn 0;というわけでもあるまい。
>fputs(">>",fp);
>sprintf(h,"%d",i);
>fputs(h,fp);

fprintf(fp, ">>%d", i)
792デフォルトの名無しさん:02/04/19 14:45
>>791
それは、あとできずいて直しますた
>>788
余裕があったらエラーチェックも入れてください。
>>788
> for(i=0;i<=input;i++){
仕様が良くわからないのだが
input = 10の場合、11回繰り返したいのか?
795デフォルトの名無しさん:02/04/19 14:55
>>794
実は、もう終了しました。
スマソ
>>795
自分で十分考えてから質問すれ。

printf の桁指定のところを可変にできませんか?

例えば、

int keta = 5;
float num = 1.0;
printf("%.7f", num);

とあった時に 7 の所を 変数 ketaで指定し、
結果の表示が 5 桁になるように、とか。
できます。
798じゃないけどヒント。

char* s = "%.7F";
printf(s, num);
おいおい、こうだろ?(w

printf("%.*f", keta, num);
おおー、そうなんか。すまん。俺も知らんかった(藁
いや、勉強になった。さんくすこ。
>>799
fは小文字じゃなくてもいいの?
803797:02/04/19 16:53

出来ました。(^-^

K&R の精度指定のところ(p305)ばっかり見てたんですが、
ちょこっと後 (p306) に書いてありましたね。
全然気がつかなかった。

サンクス。
804デフォルトの名無しさん:02/04/19 20:24
Cマンセage
805クレジャパン:02/04/19 20:45
つまらない事をお聞きしますがC言語ってなんですか?

グーグルの予感・・・。
荒れる予感。
>>805
UNIX開発専用言語。
>>805
高級マクロアセンブラ。
>>805
>>805>>808には使うことのできない言語。
7行スレ荒らしたのはおまえか?
811デフォルトの名無しさん:02/04/19 23:14
標準関数のソースって手に入れられますか?
812名無しかも:02/04/19 23:31
関数の外に変数の宣言をおくと、どこの関数からも参照できる変数になり便利ですが、なるべく使わないほうがいいのはどうしてですか?
813デフォルトの名無しさん:02/04/19 23:33
>>812
混乱するから。
手に入るよ
俺が書いたやつなら/cygdrive/d/prog/library/standard_library/
にstring.hとctype.hがあるから持ってげ
親の通帳とハンコをリビングに置いておくと、家族誰でもお金を引き出せることができ便利ですが、なるべく隠しておくほうがいいのはどうしてですか?
816デフォルトの名無しさん:02/04/19 23:35
メモリーの無駄使いになるから
817デフォルトの名無しさん:02/04/19 23:38
>815
貧乏になるから
>>641 遅レス
DOS時代は、最速コードを吐くと言われたコンパイラ。ちょっと前からFreeに。
Win版の性能はわからない。多分悪くないんじゃない?
819ほえほえ:02/04/20 00:01
el のコンパイルウィンドウfにメニューバーって付けれます?
820デフォルトの名無しさん:02/04/20 00:23
膨大な要素を持つ配列の上位数個を取り出してソートしたい時、
例えば、トップ10を抽出したいとき、全要素をソートして上位を
取り出すのは効率が悪いですよね。

void qsort(void *base, size_t nmemb, size_t size,
 int (*compar)(const void *, const void *));

に習い、

void topsort(void *base, size_t nmemb, size_t top, size_t size,
 int (*compar)(const void *, const void *));
※ただし、top は抽出したい要素の個数とする

という関数を(考えうる最高の実行速度になるように)書いてください。
821デフォルトの名無しさん:02/04/20 00:25
  ∧__∧
 ( ・∀・)<「書いてください」
 (u  u)
822やっぱり既出?:02/04/20 00:40
板違いもしくはスレ違いかも知れませんが・・・

UNIXのCと普通の(林晴比古とかが解説してる)Cって
どう違うのでしょう。
何か「機械系のCとUNIXのCは全然違う」とか言われたんですけど、
どこが違うのか全然わからないのです。
どなたか教えていただけないでしょうか・・・。
        ∧_∧
        ( ´Д` ) 書いてください。(しかも考えうる最高の実行速度で)
       /,  /
      (ぃ9  |
>>820
上位n個を取り出すなら「ヒープソートを途中まで」というのが
とりあえず基本かと。もっと高速な方法もたぶんあるだろうけど。

つーわけで頑張って(考えうる最高の実行速度になるように)書け。

>>822
Cという言語自体は基本的に全然変わらん。
OSとかシステムに依存するライブラリの部分は色々と違うだろう。
825デフォルトの名無しさん:02/04/20 00:59
(;´-`).。oO(>>820 こいつはヲレに対して挑戦してきてるのか・・・?)
(;;´-`).。oO(どう答えてやるか・・・・・)
(;;;´-`;;).。oO(クイックソートかよ・・・不慣れなやつじゃん・・・)
(;゚-゚).。oO(.......)

(;つДT) < >>820は逝ってよし!
>>820
結果は base[0] から base[size*top-1] までに上書きしていいのか?
>>820
CやめてC++のpartial_sortでも使え!プログラムせんでええぞ。
>>827
それはいけましぇん。意味が違う。
>>820
それ、宿題の問題文を敬語で書き直しただけちゃうんか
>>822
機械系(組み込み系)とUNIXのCの違いは、824が書いた通り、言語としては同じ。
組み込みだと、標準ライブラリが有っても使えない事も多い。
メモリ消費量や、実行速度、あるいは割り込みの関係上ね。

組み込みは、コンパイルされたコードが正しく実行されるとも限らない。
データバス、もしくはアドレスバスが切れている、又はブリッジしている状況も
想定出来ないと、初めて出来上がったハードの最初のプログラマにはなれない。
OS込みなら普通テスト済みのハードだから、おかしければエラーで済む所だけど。
>830 初めての男になれるわけですねハァハァ
>>820
その課題、結構面白いね。
>>824
確かに、それがよさそうだね。

1.トップ要素が最低値になるようなヒープを保持しておく
2.ヒープにつっこむ最大要素数を抽出したい要素数とする
3.ソートしたい配列を走査していって、ヒープのトップ
 より大きな値が来たら、ヒープのトップ要素と交換して、木を再構成。

最後に取り出す時は、ヒープに使ってた配列をクイックソートってのが
効率いいのかな?
833デフォルトの名無しさん:02/04/20 07:59
>>820
quicksortはO(logN*N)に比例するけど
Top10なら10個の要素のみ記憶して,バイナリサーチで探して挿入するのが
いいんじゃないかのん。計算量がlog2_10*Nに収まるからこっちのほうが
速いのではないかと思われ。

>>811
検索ぐらいは、かけような。
ftp://ftp.gnu.org/gnu/glibc
835名無しかも:02/04/20 11:35
fopenは必ず fclose しないといけないんですか?
fp == NULL の場合も fclose しないといけないんですか?
オープンに失敗したら閉じなくてもいいだろ。
NULLの場合はfcloseしてはいけません
838835:02/04/20 12:14
>>837

何でですか??
839837じゃないけど:02/04/20 12:28
>>838
例えば、FreeBSDの man fclose によると、
fclose() does not handle NULL arguments; they will result in a segmentation violation.
だそうです。
840835じゃないけど:02/04/20 12:33
実行時の効率を最優先するCのライブラリはそういったNULLの
確認を基本的にはやってくれないんですよね?
Cはコードに書いていないことは基本的に何もやってくれません。
すべてプログラマの責任です。
842841:02/04/20 12:42
/* 2行目なんか変だけどまあいいや */
843837じゃないけど:02/04/20 12:44
>>840
ごめん、>>839だけでは情報不足でした。
fclose() does not handle NULL arguments; they will result in a segmenta-
tion violation. This is intentional - it makes it easier to make sure
programs written under FreeBSD are bug free. This behaviour is an imple-
mentation detail, and programs should not rely upon it.

fclose()は、NULLが渡されても無視します。だって、NULLにアクセスしようとすると
セグメンテーション違反になるんだもん。ちなみに、これはワザとやってることで、
FreeBSDで動くプログラムでセグメンテーション違反を発生させにくくするためなのよ。
このfclose()の動作はおまけ機能みたいなもんなので、これに頼らないこと。

なので、FreeBSDは一応fclose()がNULLチェックしてくれるみたい。
double freeと似た様な状態になるのね。
845デフォルトの名無しさん:02/04/20 13:03
自作ヘッダファイルの使い方が良くわかりません。
関数宣言をぶち込めば良いんですか?
>>845
本読んだり、人のソース読んだりしてみてください。
オブジェクトファイルに含まれない全ての情報をぶち込んでください
>>845
おれは、他のファイル(*.c,*.h)から参照される可能性がある
・プロトタイプ宣言
・定数定義
・構造体定義
などをぶちこむようにしてる。
>>845
関数と変数宣言以外は皆書けってことだな。
850デフォルトの名無しさん:02/04/20 14:02
extern "C"
http://www.dodgson.org/lab/hat/polc.html
ここに出てるコード↓、

while(a++ == b++);

クールだと書いてありますが、どういうときに使えるんでしょうか。
ループ前に a == b なら止まらず、そうでなければa,bのインクリメント
一回以外に何も起きないようにおもうのですが。。。。。
>>851
文字列をコピーするのに使える。
もしくは終端がNULLで終わっているものなら何でも。
>>851
while (a++ = b++); の間違いじゃないか?
>>852
でも while の中身空っぽだよ?
>>851

a と bが同じ型だったら、無限ループになるような。。。
どっかで止まるんじゃない?
文字列だったら '\0' を通りすぎた後とか。
while (a++ = b++); だと non-lvalue in assignment で
コンパイルできねっす(gcc)。
while(*a++ = *b++);
の間違いでは?
859851:02/04/20 16:04
>>858
なるほど、ようやく意味がわかりました。
元URLはコレの間違いなんですかねえ。
>>858
それの間違い以外にちょっと考えられないけど、
アスタリスクの抜けに、代入と比較の取り違えの
2個所も間違ってると、なにかあるんじゃないかとかんぐってしまう…
良くわからんが、
「非0→真」「0→偽」
というのを暗黙的に使うなと言う説明のために
適当に書いた、特に意味の無いコードなのかもしれん。

>>858 こういうのは?

int strcmp(char *s, char *t){

while(*s++ == *t++);

return *s - *t;
}
元記事はC++らしいね。
省略なしで書くと↓ってなってる。
while(true == (a++ == b++)){ /* do nothing */ }
>>862
sとtの中身が同じだとまずいような…
865820:02/04/20 16:30
こんなんでいいですか?

void eztopsort(void *base, size_t nmemb, size_t tnum, size_t size,
int(*compar)(const void *, const void *)){
int i, j, mi;
char *bp, *tmp;
bp = base;
tmp = ezmalloc(size);
for(i = 0; i < nmemb * size && i < tnum * size; i += size){
for(mi = j = i; j < nmemb * size; j += size){
if(compar(bp + mi, bp + j) > 0) mi = j;
}
memcpy(tmp, bp + i, size);
memcpy(bp + i, bp + mi, size);
memcpy(bp + mi, tmp, size);
}
free(tmp);
}
866デフォルトの名無しさん:02/04/20 16:33
>>861
でもcoooolってかいてあるしなぁ。。
867820:02/04/20 16:34
ezmallocは、確実にメモリを確保できると仮定したmalloc
>>864

言われてみればそういう気もするが、
なぜかうちの gcc(2.91) では s と t が同じでも動く。
何故だ。
>>868
同じ時の戻り値は?
変数の外側のメモリにまでどんどんアクセスしてってそのうち一致しただけじゃないの?
870デフォルトの名無しさん:02/04/20 16:43
>>868
segvらないでどうにか動くのは まぁ ともかく、それで結果(戻りのint)も正しいのかい?
>>868
書き込みしてないから一応動くんじゃない?

↓ここを変更すると正しく動くと思うけど。
return *(s-1) - *(t-1);
872デフォルトの名無しさん:02/04/20 16:44
ime.nu 経由じゃこのスレ見ないだろうから、だれか本人にメールできいてみてくれw
関連記事はなかなか素晴らしいし、きっとデキる人なんだろうと思う。
873868:02/04/20 16:45
下二行は間違い。
874デフォルトの名無しさん:02/04/20 16:45
>>871
> 書き込みしてないから一応動くんじゃない?
んなーこたないだろ
875869:02/04/20 16:45
>>873は868じゃなくて869ね。
中身が同じだと最低確保した1バイト先までアクセスする部分に目をつぶったとしても、
中身が同じでも0が返らないから使い物にならない。
877868:02/04/20 16:51
>>869 >>870

戻り値はちゃんと 0 になる。
何で動いてるのかわからん、暴走するはずだよな。
つうーかお前らもコンパイルして下さいよ。(W
/*
中身が違う場合だけ使って下さい
中身が同じ場合の結果は不定です。
*/
int strcmp(char *s, char *t){
while(*s++ == *t++);
return *(s-1) - *(t-1);
}

これでよし。
879デフォルトの名無しさん:02/04/20 16:57
>>878
関数名はstrcmp_にすべきだ。
で、
#define STRCMP(s1,s2) ((!strcmp(s1,s2)) ? (strcmp(s1,s2)) : (strcmp_(s1,s2)))
これでよし。安全。

868 は標準関数と名前がかぶってるので実際は変えてあります。

一応直しとく。

int strcmp(char *s, char *t){

while(*s != '\0' && *t != '\0' && *s++ == *t++);

return *s -*t;
}

直ってなかったら誰か直して(他力本願モード)。
881デフォルトの名無しさん:02/04/20 17:07
もういいよ。ネタはだしっぱで放置しようやw
>>880
>>880
ちなみにそれは間違ってるよ(w
883868 = 880:02/04/20 17:11

何か本題とエラくはずれてしまった。
884845:02/04/20 17:11
>>846-849
わかりました。ありがとうございます。
>>882
あら、直しといて。(W
>>885
*s++ == *t++がfalseでwhile抜けた時は、return *(s-1) - *(t-1);
887デフォルトの名無しさん:02/04/20 17:20
intをcharに変換する標準関数ってありますか?
(atoiの逆)
itoa,sprintf
itoaは標準じゃないかも。
890デフォルトの名無しさん:02/04/20 17:22
>>887
snprintf
snprintfは新しいコンパイラにしか入ってないかも。
892デフォルトの名無しさん:02/04/20 17:26
sprintfは危険かも。DQNかも。

893887:02/04/20 17:36
みなさんお答えありがとうございます。
早速試してみようと思います。
a portable implementation of snprintf
http://www.ijs.si/software/snprintf/
895デフォルトの名無しさん:02/04/20 21:32
CString::Format
CStringは標準じゃないかも。
897デフォルトの名無しさん:02/04/20 22:07
std::stringstream::operator<<(int) と
std::stringstream::str()

898デフォルトの名無しさん:02/04/20 22:12
まああれだな、
%d とかの書式で出力すること自体時代遅れだしな。
>>895,>>897
ここCスレなんですが。
        ∧_∧
       ( ´Д`) <はぁー・・・
      /    \      
   _  | |    | |_..∬
  |\ ̄ ̄ ̄ ̄ ̄ ̄ 旦.\
 ./..\\            \
/   \|=================|
\    ノ     900       \
901デフォルトの名無しさん:02/04/21 02:38
>>887
char a;
int n;
a = (char)n;
902デフォルトの名無しさん:02/04/21 02:38
ちょうどいい話題なんで便乗質問。
intの値を引数として渡すと、文字列に変換して返す関数ってC(もしくはC++)にはないのかな?
結構調べてもみつからなかったんで。
ないとしても、どうしてないのかな?
しいてあげるなら
_itoa()
だがこいつはANSIじゃないからな。
つーわけでない。自分で作るよろし。
俺が作った符号無し整数をb進文字列にするitobならあるが
>>902
1. sprintfが有るから。
2. 標準になくても、多くの処理系に入ってるから。
3. このくらい誰でも作れるから。
906902:02/04/21 02:57
>>903
レスありがとう。
マニュアル見ました。
javaでいう String.valueOf(int) みたいな簡単なのってないのね。
でもなんで標準でないんだろう??
そっちのほうが気になる。
907902:02/04/21 02:59
>>905
あわわ、ありがとう。
必要なものは自分で作る
これCの常識
909905:02/04/21 03:09
>>902
4. C++だったら演算子のオーバーロードが有るから。cout << 774 とか。
910902:02/04/21 03:13
あー、なんとなくわかってきた。

たとえば char* IntToStr(int i)という関数をつくったとして、
その中でとったchar*の領域は誰が開放するの?
って理由からなのかな?ぜんぜん違う?
911905:02/04/21 03:44
>>910
そういう関数の主な実装で例を挙げると、
printf("%s,%s\n",intToStr(1),intToStr(2));
の結果が保証されない。
vc++のitoaで同じ事やると、1,1が表示されます。

これを回避する為に毎回mallocすると、楽しい事になります。
素直に
void IntToStr(int i,char *p, int max_len)
みたいな形で作るのがよいかと。
>>912
それじゃあsprintf使えばいいじゃん。
914902:02/04/21 04:13
>>911
うーん、よくわからないです。
なぜ保証されないのでしょう?

>これを回避する為に毎回mallocすると、楽しい事になります。
メモリリークするってことですよね?
char *str;
str = intToStr(1);
free((void *)str); //書き方まったく自信なし

こういうようにしなければいけないから標準ライブラリ(っていうのかな?)
にはないのかなと思って。

>>913
うん(w
915デフォルトの名無しさん:02/04/21 04:16
C++でいいならstd::stringで返せばいいし、前にちろっと書かれた
stringstreamを使っても良い。スレ違いになるけどな。
>>914
保証されないのは
sprintf(str,"%s %s\n",_itoa( a, buf, 10),_itoa( b, buf, 10) );
とかした場合かな?
関数の呼ばれる順序が規定されていない?のと、
両方とも同じポインタを返すために後者の結果のみが反映されるせいでしょ。

sprintf(str,"%s %s\n",_itoa( a, buf1, 10),_itoa( b, buf2, 10) );
なら問題ないかも。

なんでitoaが標準ライブラリにないかは分からんなぁ。K&Rにでも聞いてくれ。
917デフォルトの名無しさん:02/04/21 06:44
itoaをつくるとltoaやftoaも作らなければならなくなるからじゃん。
sprintfならそれら全てをこなしてくれるのに。
>>917
テンプレートの偉大さを痛感するとき・・・ってテンプレートじゃ対応しきれないなw。
919デフォルトの名無しさん:02/04/21 11:12
>>918
できますよ。一例をだすなら boost::lexical_cast<T>(num);
数値->文字列なんて、まともな設計をしとけば
UIでデータを出力する部分にしか使わないでしょ。
(ほとんどの場合ね)

プログラムのうち、最後の方でチョビット呼び出せばいいだけなんだから
sprintf系の関数で十分。
加工もしやすいし、それほど動作も遅くない。

それ以外で、どうしても全体の速度に影響するような場面でitoaみたいの
を使いたいときは、高速なitoaを自分で実装しよう。

桁数に応じて動的にメモリを拡張するお気楽 itoa(でも遅い。解放が面倒)
桁数は固定だけど激速のitoa(桁あふれのチェックをはずすとメモリ破壊の気可能性)
桁数を指定して固定長バッファに書き込むitoa(桁数をスタックに積んだり桁数チェック
する分若干の速度低下)

要求される速度、安全性に応じて、いろんなバージョンが考えられるから
やっぱすきなの作れ。
>>916
sprintf使うならはじめっからそこで書式指定しろよ...
>>921
おまえはツッコミの天才だな
俺も基本的には sprintf だな。
1文字とか2文字に限定される場合は、'0'を
足したりするかも。
  x &= 0xf;
  ( x > 9 ) ? x + 'a' - 10 : x + '0'
924デフォルトの名無しさん:02/04/21 15:34
新スレきぼーん。
俺が立ててもよいが、名前が思い浮かばん。
ただ"日下部陽一"とかくだけではだめなんだよな?
金融プログラマー日下部陽一
うーん、ちと長い?
>>925
それで立ててくる。
intに、カンマをつけた文字列に直す関数、てのが結構欲しいんだが
そういうのってない?
9654403

9,654,403
に変換するやつ。sprintf()では無理だし。
自分で書くよろし。
>>928
sprintfで文字列に直してからカンマを挿入すればすごく簡単じゃない?
>>851
858 の指摘が正しいです。ごめんなさい
sprintfがバグります。
同じソースをUNIXのgccでコンパイル→UNIXで実行すると動くのに、
Borland C++でコンパイル→WIN98で実行すると
その後の入力が全部壊れてしまいます。
これってプログラムが間違ってるってことでしょうか?
>>932
具体的なコード見せれ
>>932
>これってプログラムが間違ってるってことでしょうか?

そうです(断言)。
>>932
マルチは氏(略
fwrite関数で,構造体を保存して,fread関数で読みこもうとしたんですが,

ソースファイルの検索
CRT0.Cのパスを入力してください

とでます。

保存したファイル名は,name.datなんですが。
>>936
すごいことになってるなぁ。
とりあえず解決できそうにないけど、OSとコンパイラ何?
OSはWindows98で、
コンパイラは,VC++6.0です。
ファイル軽いから,UPしたほうが早いですかね?
939937:02/04/23 23:16
>>938
そのエラー、ビルド時に出るんじゃなくて、実行時にでるの?
なぜだーーー
まぁ、短いならUPしてちょ。
つか、デバッガのステップ実行でおこってるような‥‥
拡張子zipに変更してください
ttp://sylphys.ddo.jp/imgboard/img-box/img20020423232833.jpg
あと、1が書きこみ関数用で,2が読みこみ関数用です。
あのー
943デフォルトの名無しさん:02/04/23 23:54
やっぱりスレの1は日下部先生じゃないとビシッとしないな。
次スレの1でD.リッチーとかやるなよ。スレがダレルからな。
944937:02/04/24 00:01
>>940
ほんとだ。こんなの出るのか。
とりあえず、
printf("sizeof(Kou)=%d\n",sizeof(Kou));
printf("sizeof(struct tag)=%d\n",sizeof(struct tag));
printf("sizeof(Kou[0])=%d\n",sizeof(Kou[0]));
これ入れて、結果を吟味するべし。>>938
945938:02/04/24 00:14
俺だけのエラーじゃなかったか。
どこか問題ありますかね?
上の3行を入力してみましたが、どう吟味すればいいんでしょうか?
とりあえず、疲れたんで今日は寝ます
946デフォルトの名無しさん:02/04/24 00:21
fwrite(&Kou,sizeof(Kou),3,fp);
fread(&Kou,sizeof(Kou),3,fp);

&Kou → Kouでなくて?
947937:02/04/24 00:34
>>946
一応、そこは特例で大丈夫。個人的には気持ち悪いけどね。
printf("Kou = %p\n",Kou);
printf("&Kou = %p\n",&Kou);
948937:02/04/24 00:36
>>945
その3行が何をしているのかと、結果がどうなったのかを吟味する。
949デフォルトの名無しさん:02/04/24 02:53
C言語における、「再利用性」とは何かのべれ
950デフォルトの名無しさん:02/04/24 03:12
>>949
コピーペーストをすることで、ある機能を簡単に別の処理で
再利用できる。

…でも、そんなことしちゃだめ。
>>949
Cなら機能(関数)をライブラリとして再利用できる。ってとこか。
今じゃ普通の機能だが、当時は画期的だった。
952938:02/04/24 16:55
>>937
朝起きてから,よーく考えて,苦手なCreateFile関数,WriteFile関数を勉強して,
なんとかちゃんといくようになりました。
宿題手伝ってるっぽいな
954938:02/04/24 19:50
CreateFile関数とWriteFile関数を使って,バイナリデータとしてじゃなく、
ファイルに直接書きこむ事はできるのでしょうか?
>>954
はぁ?
ファイルの概念に対する理解が根本的に違うっぽいぞ
WriteFileは改行の変換などはやってくれないので、
そこは自分で配慮する必要がある。
なお、「ファイルに直接書きこむ」はやや意味不明瞭なので、
この「直接」の意味がはっきりするまでは何ともいえない

すんませんでした。
テキストファイルとして,書きこめるのでしょうか?
>>955
まるで COBOLer さんのようだよね
pPD=(struct daaaa *)malloc(sizeof(struct daaaa)*iLine);
こんな感じでmallocしたのですが、n番目の構造体にアクセス
するにはどうすればよいでしょうか。
pPD[n-1]
あぁっ!レスありがとうございます。早速試してみます
デキター!サンクスです>>960
保全
ESCコードを使ってコマンドプロンプト上に
色つきの文字を出力したいんです。ただし
OSはWindowsXP,コンパイラはLSI-C86(試食)。
(Win98の方は確認済)
実際にやってみると

printf("\x1b[34m hoge"); /* blue */
printf("\x1b[2J"); /* clear */   

ESCの部分が改行記号(半角)になって
しまいますが、やはり不可でしょうか?
(どれかのWin Ver. 以降, DOSが変わったと
 聞いたことがあるんですが。)
よろしくお願いします。
>>964
Win2kのpromptコマンドで実験。やはりESCは改行に。
DOSとコンソールは違うと言う意味を理解した瞬間でした。
966仕様書無しさん:02/05/10 12:24
>>965
(´ヘ`;)ハァ?
ANSI エスケープシーケンスを使いたいなら、
COMMAND.COM の上でも、ANSI.SYS を事前にロードしておくことが
必須だよ。
(;´д`).。oO( ていうか、イタチ飼い )
967デフォルトの名無しさん:02/05/12 20:37
保全age
968「あ、gcc落ちた。」:02/05/12 20:42
http://pc.2ch.net/test/read.cgi/tech/1020756993/
19まであるのに保全はねぇだろう。
969デフォルトの名無しさん:02/05/12 21:30
getchで文字列取りたいんだけど
文字以外のキー無効にするのはどうすればいいの?
例えばDelとか。
>>969
単に無視すれば?
うめうめ
前スレ 15 は埋めたが、もう20も逝ってるからな。
早く埋め立てよう。
ネタは無いけど埋め。
お手伝い
お手伝いその2
     ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄
ピュ.ー ( ・∀・)< お待たせ〜♪
  =〔~∪ ̄ ̄〕 \______
  = ◎――◎
  , -=〜=―- 、
 ミ          ヽ
二 ノ (          i
三 ⌒ へ    /` |
二    _     _ |  
三    ┰     ┰ |    
l^          (
} !  ヽ /  {\ ノ
l    i  ( 、 , ) {
∪、      j   |    / ̄ ̄ ̄ ̄ ̄
  |  ‐――――┴、  < sageだこりゃ
  |     ̄`ー―ァ'′  \_____
  \______)
 
981
982
983 :02/05/24 01:22
985密かな戦い:02/05/24 01:38
>>979

それいいなぁ・・・・・
Σ(゚Д゚;)
1000やった:02/05/24 01:58
              ∧            ∧
              / ・           / ';,
             /  ';          /  ';  1000 ワショーイ…
             /   ;______/   ;
          /                  \
         /    /          \     \
        /´   (  ) |____|  (  )      |
       |  /////  (  |     :|    )  /////    |
       |    (   ) :|      |  (   (       |
        |    )  (  |     |   )   )      |
        |   (   ) ';    /   (   (     /
         \  )  (   \/    )   )  ../
           ヽ              ........:::
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。