■ 2ちゃんねるは、ここのサーバを使ってるです。。。
 .jp ドメインお持ちのお客様大歓迎。maido3.jp
 .fm 取得代行します。(US) maido3.fm
 .ca 取得代行します。(US) maido3.ca
 .com .net .org 取得代行します。(US) maido3.com
 .cc .to .tv 取得代行はじめました。NEW
人気サイト
月々1,000円からの BinboServer.com 2ちゃんねるも使っている Big-Server.com
>> 2ちゃんねる、サーバ監視所

■掲示板に戻る■ ■過去ログ倉庫めにゅーに戻る■
C言語なら、俺に聞け! <16>
1 名前: マカー代表 日下部陽一 投稿日: 02/04/11 00:48
漏れは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


3 名前: デフォルトの名無しさん 投稿日: 02/04/11 00:48
delete this;


4 名前: デフォルトの名無しさん 投稿日: 02/04/11 00:50
長い。


5 名前: デフォルトの名無しさん 投稿日: 02/04/11 00:50
>>1 は本物の日下部。


6 名前: 緑茶。 p0086-ip01kagawa.kagawa.ocn.ne.jp 投稿日: 02/04/11 00:51
うんこ


7 名前: デフォルトの名無しさん 投稿日: 02/04/11 00:54
( ´д`)=○)'β') ←>>6


8 名前: 緑茶。 p0086-ip01kagawa.kagawa.ocn.ne.jp 投稿日: 02/04/11 00:57
しょうもないことで
いちいちぴりぴりしてちゃ
この先生きていけんぞ


9 名前: デフォルトの名無しさん 投稿日: 02/04/11 00:59
どの先生がなんだって?アフォ


10 名前: 緑茶。 p0086-ip01kagawa.kagawa.ocn.ne.jp 投稿日: 02/04/11 01:01
あぁ、世知辛い世の中


11 名前: デフォルトの名無しさん 投稿日: 02/04/11 01:10
香川県の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);
...?


14 名前: デフォルトの名無しさん 投稿日: 02/04/11 08:54
>>13
いや、子プロセス作るのは勝手だけどさ・・・。


15 名前: デフォルトの名無しさん 投稿日: 02/04/11 09:30

ファイル 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 は標準入出力を使う前堤で作ってます。
一応目的は達成できてるんですが、何か ダサダサ な気がするので、
もうちょっとスマートなやり方はないでしょうか ?



16 名前: デフォルトの名無しさん 投稿日: 02/04/11 09:34
15はホントに「標準入出力」の意味をわかっているのかと、
ついでに、そのfpprogは一体なんだと、小一時間(略)


17 名前: デフォルトの名無しさん 投稿日: 02/04/11 09:38
>>16
く、先を越された。激しく同意!


18 名前: 15 投稿日: 02/04/11 09:43
>>16
>>17
小一時間問い詰めて下さい。
激しくキボンヌ。


19 名前: デフォルトの名無しさん 投稿日: 02/04/11 09:48
>>18
まず、
$rm file.out
$./prog
$ls file.out

実行。

・・・っていうかそれ正常に動くのか????
思いっきり自分自身を書き変えようとしてるが・・・。


20 名前: デフォルトの名無しさん 投稿日: 02/04/11 09:52
>>15
while(scanf("%c",&a) != EOF)
printf("%c",a);


21 名前: デフォルトの名無しさん 投稿日: 02/04/11 09:53
>>20
getchの方がいいね。


22 名前: デフォルトの名無しさん 投稿日: 02/04/11 10:08
>>15
標準入出力のFILE構造体へのポインタはstdin、stdoutだろ。
わざわざfopenする必要はない。


23 名前: 15 投稿日: 02/04/11 10:16
>>19
一回出力ファイル(file.out)消してやってみましたが、
やっぱりちゃんと作られます。

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

>>21
linux 使ってますが、getch は無いような・・・。



24 名前: デフォルトの名無しさん 投稿日: 02/04/11 10:17
>>15
「標準入出力を使って動作するプログラムがすでにあったとして、こいつに特定の
ファイルを食わせて特定のファイルに吐き出させるプログラムを作りたい」ってこと
だよね?
system("./prog < file.in > file.out") が一番スマートな気がするけど…


25 名前: 15 投稿日: 02/04/11 10:30

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

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

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

>>15 のどこかで stdin, stdout を開いているということですか?
それとも内部的にそうなるとか、そういうことでしょうか?



26 名前: デフォルトの名無しさん 投稿日: 02/04/11 10:32
標準ライブラリが main()を呼ぶ前に stdin, stdout, stderrを開いている
(内部的にfopenを同等の動作)

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

とりあえずそういうもんだと思え。



27 名前: 15 投稿日: 02/04/11 10:55

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

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

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


>>19
コードは間違っていないようです。



28 名前: 15 投稿日: 02/04/11 11:08

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

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

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

なにか話が噛み合っていない気が・・・むぅ。



29 名前: デフォルトの名無しさん 投稿日: 02/04/11 11:12
>>1はvoidたんに戻ったのか。


30 名前: デフォルトの名無しさん 投稿日: 02/04/11 11:26
>>27
sprintf(cmd, "%s < %s > %s", prog, file_in, file_out);
system(cmd);


31 名前: デフォルトの名無しさん 投稿日: 02/04/11 11:32
>>28
お前のアフォさ加減にかなりゲンナリだが… それとも新手の荒らしか?(藁

入力するファイルと出力するファイルをリダイレクトしてる
わけだからソース中ではファイルのオープンをせずに
標準入出力のライブラリ関数を使えばいいだけだろう。
printfでもgetcでも好きなの使え。


32 名前: 24 投稿日: 02/04/11 11:32
>>28
> 15 のコードのどこかで stdin, stdout, stderr のどれかを閉じているということでしょうか?
> または結果的にそういうことになっている、と言うことでしょうか?

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

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


33 名前: デフォルトの名無しさん 投稿日: 02/04/11 11:37
>>32
なんだそういうことか… 笑うしかないな(藁


34 名前: デフォルトの名無しさん 投稿日: 02/04/11 12:13
プログラムを組む上で最も大切なものは、論理的な思考 | 正確な日本語 だと思います。


35 名前: デフォルトの名無しさん 投稿日: 02/04/11 12:40
>>34
&じゃなくて|を使うところがプログラマらしくてよろしい。


36 名前: デフォルトの名無しさん 投稿日: 02/04/11 12:54
>>35
&&じゃだめ?


37 名前: デフォルトの名無しさん 投稿日: 02/04/11 12:56
文字列をC言語の式として評価して
値を求めるコードを書きたいのですが、どうしたらいいでしょうか?

例>
char tmp[]="12>=24 && 23*5>4*29";
tmpをある関数に渡すと、FALSEが返る。


38 名前: デフォルトの名無しさん 投稿日: 02/04/11 12:58
>>34-35
論理的な思考ができれば、正確な日本語は必要ないってことか・・・


39 名前: デフォルトの名無しさん 投稿日: 02/04/11 13:00
>>37
そいつあ、難しい。
なんかのインタプリタから、式評価関数をパクってきたほが
早いかも。


40 名前: デフォルトの名無しさん 投稿日: 02/04/11 13:03
int c;
while(c=getchar(),c != EOF)
putchar(c);


41 名前: デフォルトの名無しさん 投稿日: 02/04/11 13:06
>>38
|| じゃなくて | です。1からやり直しましょう。


42 名前: デフォルトの名無しさん 投稿日: 02/04/11 13:19
>>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);
}


45 名前: 15 投稿日: 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




46 名前: デフォルトの名無しさん 投稿日: 02/04/11 14:06
43です。寝ぼけてました。なかったことにして下さい。


47 名前: 38 投稿日: 02/04/11 14:37
>>41
やり直してきます&0


48 名前: デフォルトの名無しさん 投稿日: 02/04/11 18:24
a
ab
abc
abcd

↑のようにzまでにコンソールに出力したいんですができません
誰か助けて〜


49 名前: 31 投稿日: 02/04/11 18:27
>>45
スマソスマソ。こっちの誤解だった。でもまあ、>>31の下の文章の日本語は
わかりにくいか?この例の話の筋とは違うが。


50 名前: デフォルトの名無しさん 投稿日: 02/04/11 18:32
>>48
ん?


51 名前: 48 投稿日: 02/04/11 18:35
ほんとお願いしますよ〜
できないと明日先生に怒られるんですよ〜
配列を使えと言われたんですが私にはわかんなかったです


52 名前: デフォルトの名無しさん 投稿日: 02/04/11 18:37
>>48
こっちで訊いてね。
http://pc.2ch.net/test/read.cgi/tech/1011722640/l50


53 名前: デフォルトの名無しさん 投稿日: 02/04/11 18:37
>>51
宿題は自分でやろぉね。


54 名前: 48 投稿日: 02/04/11 18:52
わかった。
無知な人に聞いても無駄だよね。ごめんね


55 名前: デフォルトの名無しさん 投稿日: 02/04/11 18:54
無知な人は聞いても無駄だよね。ごめんね


56 名前: デフォルトの名無しさん 投稿日: 02/04/11 19:00
48は荒らし


57 名前: デフォルトの名無しさん 投稿日: 02/04/11 19:09
char ch, str[30];
char *p = str;
for( ch = 'a'; ch <= 'z'; ch++){
 p[0] = ch, p[1]='\0';p++;
 printf("%s\n", str );
}


58 名前: デフォルトの名無しさん 投稿日: 02/04/11 20:13
>>57
もっとも、このソースを見ても理解不能という >>48 に誂え向きの罠。


59 名前: 57 投稿日: 02/04/11 20:17
>58
しまった。その観点から言えば、wide系の関数を使えばよかった(笑)


60 名前: デフォルトの名無しさん 投稿日: 02/04/11 20:46
#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');
    }
}


61 名前: デフォルトの名無しさん 投稿日: 02/04/11 20:55
wide系の関数って何?


62 名前: デフォルトの名無しさん 投稿日: 02/04/11 21:01
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 );
}
って事。


63 名前: デフォルトの名無しさん 投稿日: 02/04/11 21:28
あんま遊ぶなよ(;´ー`)

#include <stdio.h>

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


64 名前: デフォルトの名無しさん 投稿日: 02/04/11 22:40
A=-5;

としますよね。

このAがマイナスだということを判定(判別)するにはどうしたらいいんでしょうか?


65 名前: デフォルトの名無しさん 投稿日: 02/04/11 22:43
ここの人ってなんでこんなにレベル低いの?


66 名前: デフォルトの名無しさん 投稿日: 02/04/11 22:47
if


67 名前: デフォルトの名無しさん 投稿日: 02/04/11 22:48
もしもしー?


68 名前: 64 投稿日: 02/04/11 22:51
ごめん、わかった。
if(a > 0)
だね

なんか特別な関数いるのかと思った


69 名前: デフォルトの名無しさん 投稿日: 02/04/11 22:51
>>68
アフォですか?


70 名前: 68 投稿日: 02/04/11 22:53
  ∧ ∧
  (  ,,) ・・・
  ./  |
 (___ノ



  ∧ ∧
  (´ー`) ・・・・
  ./  |
 (___ノ



71 名前: デフォルトの名無しさん 投稿日: 02/04/11 22:53
ネタになると思ってるところが、アフォですね。


72 名前: 66 投稿日: 02/04/11 22:56
もしかして俺はネタに吊られたのか?


73 名前: 68 投稿日: 02/04/11 22:56
今暇なんよ。
俺と一緒にうだうだしようZE!(o^-')b 


74 名前: デフォルトの名無しさん 投稿日: 02/04/11 22:57
       /_________ヽ  | ΛΛマジ?
                 ガラッ!!||    三 || ̄ ̄ ̄ ||   |(;゚Д゚)
                     || エーッ!三||    / ||    |'と |⌒)
    ΛΛナニッ!?          || ΛΛΞ||  // ||   || | ノ
   (;゚Д゚)ミ            || (;゚Д゚) ||//   ||    |ι ' ~
⊆ ̄ιノυ            ||ι   ⊃||/     ||   |
 ̄ ̄| ̄ ̄| ̄|           || | | ||___ ||    |
 ̄| ̄ ̄| ̄ ̄|ΛΛホントカヨ… | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|   ____
 ̄ ̄| ̄ ̄| ̄|;゚Д゚)        ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  /\____
 ̄| ̄ ̄| ̄ ̄| /U   ズボッ!ΛΛウッソーン!?     /ΛΛ\___
 ̄ ̄| ̄ ̄| ̄| |      || (;゚Д゚) ||            |(;゚Д゚) |  ̄ ̄
 ̄| ̄ ̄| ̄ ̄|∪       ||ヾ||,,'||       п。。。|゚ι、| |オイオイ…!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


75 名前: デフォルトの名無しさん 投稿日: 02/04/11 23:29
ほんとばかばっか。


76 名前: デフォルトの名無しさん 投稿日: 02/04/11 23:35
>>74



77 名前: 48 投稿日: 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);
}


78 名前: 48 投稿日: 02/04/12 00:03
アハハ>>57よりましかな。


79 名前: デフォルトの名無しさん 投稿日: 02/04/12 00:10
>>78
そお?


80 名前: デフォルトの名無しさん 投稿日: 02/04/12 00:11
48はネタだった、に5票。


81 名前: 63 投稿日: 02/04/12 00:17
じゃぁ漏れは問題の意味を間違ってた漏れはアフォだった、に1票入れておくよ(;´ー`)


82 名前: 48 投稿日: 02/04/12 00:19
>>80俺も一票。


83 名前: デフォルトの名無しさん 投稿日: 02/04/12 03:28
>>82
邪魔。帰れ。


84 名前: デフォルトの名無しさん 投稿日: 02/04/12 06:08
#else if
みたいなことってできないですか?

今は
#if defined(__XXX__)
 ・・・
#endif
#if defined(__YYY__)
 ・・・
#endif
みたいな感じにやっているんですが、なんかかっこ悪いです。


85 名前: デフォルトの名無しさん 投稿日: 02/04/12 06:13
#elif


86 名前: デフォルトの名無しさん 投稿日: 02/04/12 06:31
>>85
ありがとうござます。
お礼にフェラさせて下さい!


87 名前: デフォルトの名無しさん 投稿日: 02/04/12 07:34
食っちゃーはぴはぴハイチュー
>>86 きもい


88 名前: デフォルトの名無しさん 投稿日: 02/04/12 07:37
Cの言語仕様(名前空間とか構文形式とか)を調べたいんだけど、
良いサイトor本ある? サイトを検索してみてyaccの構文規則
なら見つけたんだが、解説がないと意味わからんわ。

なるべく新しいのでおながいします。


89 名前: デフォルトの名無しさん 投稿日: 02/04/12 07:41
>>88
K&Rじゃだめなん?


90 名前: デフォルトの名無しさん 投稿日: 02/04/12 07:43
>>88
gccのドキュメント


91 名前: デフォルトの名無しさん 投稿日: 02/04/12 08:06
gccのサイト経由で使えそうな文書見つかりました。
ありがと>>89-90


92 名前: デフォルトの名無しさん 投稿日: 02/04/12 10:16
>>88
yacc の構文規則、なのか?
BNF 見れ。


93 名前: デフォルトの名無しさん 投稿日: 02/04/12 16:41
BMP画像を右か左に90度回転させて表示ってのができません。
メモリとってグラフィックデータを回転後の位置で並べ替えてコピーし表示、
こういう流れでやりたいのですが、どこをどうすればいいやら・・・

何か助言お願いします


94 名前: デフォルトの名無しさん 投稿日: 02/04/12 16:46
>>93
がんばれ!
助言終わり。


95 名前: デフォルトの名無しさん 投稿日: 02/04/12 16:48
>>94
あふん
でもありがとう


96 名前: デフォルトの名無しさん 投稿日: 02/04/12 16:49
dest[x][y] = src[y][width-x-1]
いじょ。


97 名前: デフォルトの名無しさん 投稿日: 02/04/12 17:43
96さんのをちょい改良したらできました。ありがとう!!


98 名前: デフォルトの名無しさん 投稿日: 02/04/12 17:50
いや論理はできたんですが型がわからず挫折。
destとsrcの型って何なんでしょうか?


99 名前: デフォルトの名無しさん 投稿日: 02/04/12 17:56
>>98
たぶん君はここでヒントもらって何とかなるってレベルじゃないと思うよ。
まるまるコードを書いてくれる親切な人をがんばってさがすしかないと思う。



100 名前: デフォルトの名無しさん 投稿日: 02/04/12 18:03
>>93
http://www.sm.rim.or.jp/~shishido/dib1.html
まぁ、このへんからコツコツと。


101 名前: デフォルトの名無しさん 投稿日: 02/04/12 22:42
>>98
まぁ、一応教えてあげると、
色深度が24〜31ビットなら、unsigned longだね。
同じく16bitならunsigned short、256色ならunsigned charでまにあう。
もちょっとスマートにするなら、構造体を定義するか、定義されてる
もの(Colorとかなかったけ?)を使おう。


102 名前: デフォルトの名無しさん 投稿日: 02/04/12 22:58
> destとsrcの型って何なんでしょうか?

とか聞いてるのがすごく心配だ・・・
その式は座標の変換を表してるだけでそのままじゃ使えないぞ?


103 名前: age 投稿日: 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を読み込ませる事。


107 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:07
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]が同じ意味になるのはなぜですか?
&がつくとアドレスを得られるから、アドレスのアドレスという不可解な意味に
なってしまう気がするのですが…。



110 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:14
>>104
日本語喋ってくれ


111 名前: 105 投稿日: 02/04/13 00:22
>>108
いや、超初心者にCを教える環境がWindows2000なんだよ。

だから、非効率でも良いから教えてください。お願いします。



112 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:23
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とか)
…意味わかりますか?説明不足でごめんなさい。



114 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:30
> 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なんか使うなってことだ。


116 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:34
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型だということ。


117 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:35
教える人が出来もしないのに、初心者に教えるだなんて・・・
残念だったが、よく有る事だ。強くイキロよ>初心者


118 名前: 111 投稿日: 02/04/13 00:37
>>115

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

ありがとう、でも使えないのはイタイ



119 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:39
>>117
>>105が初心者に教えるのはCなんだから、
Win2Kのコマンドプロンプトのこと知らなくてもいいんじゃねぇーの?


120 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:41
>>111
エスケープシーケンス互換のGDI用ライブラリ作って、それをWindowsで使用したら?



121 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:42
エスケープシーケンスなぞなくてもCは教えられると思うが・・・
# いまだかつて一度も使ったこと無いし漏れ。


122 名前: ポインタで… 投稿日: 02/04/13 00:42
>>114
いや、strcpy使ってました…なんでそんなふうに書いたんだろ、俺?

>>116
なんとなくわかります。


123 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:45
ミ゚ω゚彡 >>117は初心者。


124 名前: 111 投稿日: 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]のつもりでした。


127 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:55
>>125
アフォ
fooは何やねん。
配列に手つける前にポインタもっかい勉強しなおせ。


128 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:56
temp[0]
temp[1]
そりゃそうだろね。


129 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:57
その前に foo を…


130 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:57
SMP smp;
SMT *foo = &smp;


131 名前: デフォルトの名無しさん 投稿日: 02/04/13 00:57
> でも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を死ぬまで読みましょう。


135 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:07
BCCって未割り当てのポインタにエラー吐かないの?
警告レベル変えられる?


136 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:09
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]と同義ではないですか?


139 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:13
直接C言語とは関係ないのですが、
printf( "hoge" );
とかやった場合の内部の処理が知りたくてたまりません。
ブロッキングとかノンブロッキング(名前しか知らない)とか
メモリ関係の知識を深めたいんですけど、良本orURL教えてください


140 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:16
>>133
練習ならもっと単純なものからやりなさいな。

int i,*p; //pの指しているものはぁゃιぃオブジェクトを指している
p = &i; //pはこれでiを指すようになる
*p = 10; //わーいo(^-^)oi = 10;と同じだよ


141 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:17
     ヽ( ゚д゚)ノ ワーイ
   -=≡ (  )へ
       >


142 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:18
少しレベルアップ

struct { int i; } s, *p;//pの指しているものはぁゃιぃオブジェクトを指している
p = &s; //pはこれでsを指すようになる
p->i = 10; //わーいo(^-^)o s.i = 10;と同じだよ



143 名前: 140 投稿日: 02/04/13 01:19
X  pの指しているものはぁゃιぃオブジェクトを指している
○  pの指しているものはぁゃιぃオブジェクト


144 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:20
つーか
×pの指しているものはぁゃιぃオブジェクトを指している
○pはぁゃιぃオブジェクトを指している


145 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:20
 ワーイ ヽ(゚д゚ )ノ
     へ(  ) ≡=-
         く


146 名前: 144 投稿日: 02/04/13 01:20
うぉ!
ダブった上に直し方がちょと違う(w


147 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:21
>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]を指していると思うんですけど。違うのかな…。


151 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:26
>>147
メモリそのものの動きまでやるか・・・
それなら「やさしいコンピュータ科学」一冊で概要はわかる。
これで扱ってる言語はPascalだけど。
スレ違いだなこりゃ。


152 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:29
>>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なんてものはまだ存在してないということですか?



155 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:33
>>150
レス読むときはゆっくり読みなよ。
人間話すより読むほうが速いから、
読む速度で行くと理解できなくなることもある。
ゆっくりじっくり、しゃべるのより遅いくらいの速さで読んでみそ。


156 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:34
>>150
ブロック内の未代入の変数、ポインタ変数の値は未定義です。
fooはメモリ上の正しいインスタンスのアドレスを保持しなければ
foo->nameをしても、もうヴァカかとアフォかとという状態になります。
あとねfoo->nameの演算子は(*foo).nameと同じです。


157 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:35
>>154
ポインタなのは*fooじゃなくてfooだけど・・・
それ以外はそんな感じでいいYO!


158 名前: 156 投稿日: 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のようにしる。


161 名前: 159 投稿日: 02/04/13 01:41
うわかぶってる 逝ってくる



162 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:41
わからん。



163 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:41
ところで、文字列だけでEOFってむり?ですか? ねぇ?



164 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:42
怪談でもしようか・・・
ある日某専門学生のゲーム作品を見ていて、一つふに落ち着かないことがあった。

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

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

私は絶句した・・・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 状況がいまいち分からん。


168 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:47
typedef int* pint;
pint a = pint();
if ( a==NULL ) print( "あひゃ(・∀・)";

これ、typedef使わずにやるにはどうすればよかと?


169 名前: 168 投稿日: 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


173 名前: 164 投稿日: 02/04/13 01:53
>>166
メモリから何から何まで開放せず強制終了させていた・・・
ガタガタブルブル


174 名前: 159 投稿日: 02/04/13 01:53
UNIXのEOFはCtrl-Dだったと思うがDOSは知らん。
文字列じゃなくて標準入力からEOFは打てないのかという質問ではないですか?



175 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:53
#define EOF (-1)

南無・・・


176 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:54
>>170
ダメ。 入力されて判断してるから、無限になっちまうす



177 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:56
>>173
サーフェイスいじくってると面白いように落ちる(←アフォ)けど、
やっぱあれはDirectDraw残ってるのかなぁ。
ウィンドウが消滅した時点で自滅してくれるとうれしいんだけどなぁ。


178 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:56
DOSはCrl+Zだったと思う。
つか、どういうコード?


179 名前: 159 投稿日: 02/04/13 01:57
>>165
ごめんちゃんと読んでなかった 今度こそほんとに逝ってきます



180 名前: デフォルトの名無しさん 投稿日: 02/04/13 01:59
>>179
イキロ!


181 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:00
文字入力して、それ以降に何回その文字が入力されたかカウントするこーど


182 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:02
すまん、誰か>>181の逝ってることをうまく翻訳してくれ。


183 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:04
>>181
ん、、、どうでもいいってことかな?


184 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:04
>>170
入力をchar型で受けてない?
K&R開いてgetchar()とかの帰値の型を空の穴くまでみれ。



185 名前: 173 投稿日: 02/04/13 02:05
作ったものは開放しないとメモリに残るよ。
勝手に開放されるのもうれしいけど、それだと逆に怖いよ


186 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:06
gets(str);
while(*(str++) != '\0'){
・・・
}
というでわないのか?


187 名前: 185 投稿日: 02/04/13 02:07
>>177
が抜けてたので逝ってきます・・・


188 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:13
>>186
違うみたい。でも、入力をCHARで受けてる。


189 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:15
進行はやっ


190 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:17
(゚д゚) ・・・


191 名前: 投稿日: 02/04/13 02:23
こんな感じ

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

これなら少なくとも cがintでないと無限ループになるよ


192 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:24
?マーク忘れた



193 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:26
>>192
すげー混乱した。



194 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:30
>>191
そうなら、
((c = getchar()) != '\n'
とかで改行終了とか
((c = getchar()) != 0x1b
ESC終了とかでいいでしょ。


195 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:37
>191
char がsignedなら、終わる。


196 名前: デフォルトの名無しさん 投稿日: 02/04/13 02:50
getchar() のプロトタイプは
int getchar(void)
です。



197 名前: 196 投稿日: 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に見えてくるデータを読み出し、ファイルに落としたいんですが
どんな感じにコードかけば良いでしょうか?どこかにサンプルコードとか
おちてないでしょうか?


201 名前: デフォルトの名無しさん 投稿日: 02/04/13 03:15
>>200
なら、最初からそう質問してくれ・・・
http://pc.2ch.net/test/read.cgi/tech/992057422/
に、いらんレスつけちゃったじゃないか。


202 名前: デフォルトの名無しさん 投稿日: 02/04/13 06:13
ゲーム製作では、javaよりCが使われているのは本当でしょうか?
スピードの問題ならアセンブラもゲームでは有効だということなんですか?


203 名前: デフォルトの名無しさん 投稿日: 02/04/13 06:18
>>202
上のはホントです。
下のは一部のライブラリにおいてホントです。


204 名前: デフォルトの名無しさん 投稿日: 02/04/13 07:06
このスレの人達はなんだかんだ言って優しいと、
>>125からのやりとりを見て心底思った。


205 名前: デフォルトの名無しさん 投稿日: 02/04/13 07:52
>>203
ということは、cを中途半端な状態でjavaに行くよりしっかりとcを極めたほうが
言いということでしょうか?それとアセンブラもわかってないと困ることに
なるんでしょうか?
よろしくお願いします。


206 名前: デフォルトの名無しさん 投稿日: 02/04/13 08:04
cは概要だけでいい。
できればいきなりjavaに行くのがいいと思うが・・・

cにどっぷりつかっちゃうと、javaのスタイルになれるのに時間がかかる


207 名前: デフォルトの名無しさん 投稿日: 02/04/13 08:08
>>205
自分が何をやりたいのかはっきりさせること。
これが一番大事。動機付けて勉強できるという意味じゃ
他の分野の勉強するよりもプログラミングってのはいい位置にある。
目的がはっきりすれば自ずとどんな知識が必要になるのか分かるってもんだ。


208 名前: デフォルトの名無しさん 投稿日: 02/04/13 08:33
>>207がイイこと言った!!


209 名前: デフォルトの名無しさん 投稿日: 02/04/13 09:48
>>205
基本的に>>206に同意する。
つまり、Javaのスタイルに慣れておけば、Cでも、見通しや保守性の良い
スタイルでプログラミングできるようになると思う。

あと、アセンブラを勉強しておくと、実行効率の良いプログラムが
書けるようになるはず。
ちなみに、アセンブラはCやJavaに比べると単純な言語なので、
覚えるのは簡単。ただ単に、書く量と手間がかかるだけだよん。


210 名前: デフォルトの名無しさん 投稿日: 02/04/13 09:54
>>209
俺はアセンブラをRISCの様な言語だど言ったらモルァ!すれでゴルァ!された。


211 名前: 209 投稿日: 02/04/13 10:11
>>210
CやJavaをCISCとするなら、たしかにアセンブラはRISCのような
言語に思えるけど・・・ゴルァ!されちゃったですかー。


212 名前: デフォルトの名無しさん 投稿日: 02/04/13 10:32
javaに慣れてどうするの?とは思うが。


213 名前: デフォルトの名無しさん 投稿日: 02/04/13 10:38
>>212
マジでそう思うの?


214 名前: デフォルトの名無しさん 投稿日: 02/04/13 10:46
>>206
205じゃないですが、なるほど。
一通りCを勉強したらJavaもやってみますわ。


215 名前: デフォルトの名無しさん 投稿日: 02/04/13 11:44
>>209
> ただ単に、書く量と手間がかかるだけだよん。

これがやっかいなんだが・・・


216 名前: デフォルトの名無しさん 投稿日: 02/04/13 11:56
>>207
禿ドウ
言語やライブラリの知識があっても何も作らない人もいる。
それはそれで別にいいんだけど、そういうやつに限って
人に知識を自慢してきてウザかったりすることが多い

やっぱプログラマたるものなんか作ってナンボだよな
言語オタは逝ってよし


217 名前: デフォルトの名無しさん 投稿日: 02/04/13 14:21
atan2をテーブル化したいんだけど
どうすればいいですか?


218 名前: デフォルトの名無しさん 投稿日: 02/04/13 15:31
結局のところ、ポインタを極めてからjavaに行くか、ある程度のところ(入門書程度)
で切り上げてjavaに行くかで悩んでるのですが、そのあたりはどうなんでしょうか?


219 名前: デフォルトの名無しさん 投稿日: 02/04/13 15:33
ゲーム製作が目的ならJavaじゃなくてC++に行くべきでは?
市販のゲームはほとんど全部C/C++製だろ?


220 名前: デフォルトの名無しさん 投稿日: 02/04/13 16:56
>>217
単純にプログラム起動時に一度だけテーブルを作成すればいいんじゃない?


221 名前: デフォルトの名無しさん 投稿日: 02/04/13 17:29
>>218
ポインタ知らないとバカにされます。
一生JavaやC#の様な過保護箱庭言語だけ使うつもりなら止めませんが。



222 名前: デフォルトの名無しさん 投稿日: 02/04/13 17:56
>>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年はかかりそうなんですが。


225 名前: 217 投稿日: 02/04/13 18:11
>220
それはそうなんですけど
atan2ってy/xから角度出すじゃないですか
どうやってテーブルを作成すればいいのかな、と思いまして・・・
うう、能力不足


226 名前: デフォルトの名無しさん 投稿日: 02/04/13 18:12
>>224
ポインタは、確かにひっかかりやすいところもあるけど、
まず本読んで、自分で書いてみないことにははじまらない。
わかんなくなったらまた聞きに来なさい。


227 名前: デフォルトの名無しさん 投稿日: 02/04/13 18:13
>>225
atan_array[y][x]
みたいなのに入れとけばいんじゃない?
atan_array[y/x]ってやるのは得策じゃないと思う。


228 名前: デフォルトの名無しさん 投稿日: 02/04/13 18:16
コンピュータアーキテクチャとOS(といまだとネットワーク)の理解がないと、
どこでどの仕事しようがタダの*兵隊*にしかなれん。

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

ポインタを覚えるのが重要なのではなくて、もっと、アプリケーションを支える
環境(OS, ハードウェア)がどうなっているのか、ということに留意すること。



229 名前: デフォルトの名無しさん 投稿日: 02/04/13 18:18
>>224
何でもCでできるんだ!っていうC厨にならなければいい(すべての言語に言えるけどね)。
ポインタを知っておけば参照とかオブジェクトとインスタンスの関係などがイメージしやすいかなと思います。

なんでも知っている分には損はない。


230 名前: デフォルトの名無しさん 投稿日: 02/04/13 18:19
不便な環境を知らないと、便利な環境を便利とは感じない。
一度便利な環境に触れてしまうと不便な環境には戻れない。


231 名前: デフォルトの名無しさん 投稿日: 02/04/13 18:25
やっぱプログラマなら組み込みだよね。
あこがれるけどなりたくはないな。


232 名前: 初心者 投稿日: 02/04/13 18:32
いきなりCから始めてもなんとかなりますか?


233 名前: デフォルトの名無しさん 投稿日: 02/04/13 18:37
>>232
なんとかなります。
>>228の意見にはよく耳を傾けておくこと。
そしてPC-UNIX、(以下略


234 名前: 217 投稿日: 02/04/13 18:39
>227
どうもありがとう
なるほど、分けて考えればよかったか

ただ配列がでかくなりそうだ・・・
大丈夫かな


235 名前: デフォルトの名無しさん 投稿日: 02/04/13 19:37
>>232
C++は分からないけど、Cなら大丈夫でしょう。
ポインタだって通常の変数と同じようなものだと考えれば引っかかることはないし。


236 名前: 227 投稿日: 02/04/13 19:38
>>234
ゲーム等に使うなら、256x256くらいの分解能があればだいじょぶかも。
atan_array の型をsigned shortにして、整数部 9bit(符号付) + 小数部 7bitの
固定小数として扱えば、±180度カバーできて、1要素2バイトなので、
デーブルサイズは128KBでいけるかな。


237 名前: デフォルトの名無しさん 投稿日: 02/04/13 19:43
>>235
参照時の動作が異様に普通の変数と違いますが・・・。


238 名前: 227 投稿日: 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でした。


239 名前: 224 投稿日: 02/04/13 20:03
皆さんどうもありがとうございます。
それと、アセンブラなどの知識はどの程度もっていたらいいでしょうか?
やっぱりゲームとかやりたいなら、結構やっておいたほうがいいでしょうか?
それと、ゲームではどの程度アセンブラが使われているのでしょうか?


240 名前: デフォルトの名無しさん 投稿日: 02/04/13 20:07
>>239
世に出てるゲームで、VB製がどれだけあるか考えてみろ
VBでインラインアセンブラが使えるか考えてみろ

VBは確かに糞ゲーが多いが、そんなことを質問している時点では
その糞ゲーすら作れないから安心してできる事からやれ。
そもそも3Dのゲームでも現在はアセンブラを使うのはごく一部。
最適化ヲタでもない限り、わざわざアセンブラを使う野郎は少数派


241 名前: デフォルトの名無しさん 投稿日: 02/04/13 20:08
おまえらな、いつまでも古い言語つかってんじゃねーよ
これからはPERLだよ、PERL。わかったか、ヴォケ


242 名前: デフォルトの名無しさん 投稿日: 02/04/13 20:09
>>241
Ver 6まで行こうとしてる言語が新言語か?


243 名前: デフォルトの名無しさん 投稿日: 02/04/13 20:15
>239 = >>224
おそらくまだかなり若いのでしょうけど、はっきりいって、プログラミングに向いてないと思います。
プログラミングは自分で体を動かさないと身につきませんよ。


244 名前: 217 投稿日: 02/04/13 20:51
>238
そっちのほうがよさそうですね
使わさせてもらいます



245 名前: デフォルトの名無しさん 投稿日: 02/04/13 21:24
>>242
それは言わない約束だろ


246 名前: デフォルトの名無しさん 投稿日: 02/04/13 22:11
Cの勉強を始めたのですが
Web上では捜し物をするとあまりにいろいろなモノがヒットしてしまい
探しにくいのですが
「ここが総本山」的な日本語C言語解説サイトとかリンク集ってありますか?



247 名前: デフォルトの名無しさん 投稿日: 02/04/13 22:21
ねこでも


248 名前: デフォルトの名無しさん 投稿日: 02/04/13 22:23
猫とCFAQ


249 名前: デフォルトの名無しさん 投稿日: 02/04/13 22:36
>>246
つぅかネットなんかで基礎勉強しようとするな。


250 名前: デフォルトの名無しさん 投稿日: 02/04/13 22:58
善し悪しがわからんうちは本読んでろ。
ダメ本も数多いが、webの解説のほうがクズ率高い。



251 名前: デフォルトの名無しさん 投稿日: 02/04/13 23:06
>>237
使い方はかわらないだろ。


252 名前: デフォルトの名無しさん 投稿日: 02/04/14 00:32
>>246
とりあえず本は2冊以上買え。Cの入門書は比較的ハズレが多いから
1冊だけ買った本が糞だと自分も糞プルグラマーになるぞ。



253 名前: デフォルトの名無しさん 投稿日: 02/04/14 00:39
あした本屋さん逝きますよ。



254 名前: デフォルトの名無しさん 投稿日: 02/04/14 00:42
とりあえずK&R買え。
K&Rより安い入門書は全部糞。
入門と書いてある本も糞。

K&Rおいてない本屋は行く価値無し。



255 名前: デフォルトの名無しさん 投稿日: 02/04/14 00:55
はじめての時は、できるだけ、安くて薄い本がいい。
もちろん、それ以外に辞書(?)としてK&Rを買うのは忘れずに。


256 名前: デフォルトの名無しさん 投稿日: 02/04/14 01:03
だから未経験で心配なら結城せ、せんせぇを追加しておけばなんの問題も無い
と前から言ってるでしょーが!


257 名前: デフォルトの名無しさん 投稿日: 02/04/14 01:05
漏れはI/Oで覚えましたが、なにか?


258 名前: デフォルトの名無しさん 投稿日: 02/04/14 01:13
もれはもれもれです


259 名前: デフォルトの名無しさん 投稿日: 02/04/14 01:19
オレ、Microsoft C ver.3.0 とかいう技評かどっかの本だったような
気がするけど、既にその本無くしちゃったので詳細不明。
なんとかしてもう一度手に入れたい。


260 名前: デフォルトの名無しさん 投稿日: 02/04/14 02:00
っていうかアヒル本読めや。


261 名前: 253 投稿日: 02/04/14 02:41
一冊だけ初心者向けの本持ってますが、
アセンブラー&マシン語でのプログラミングにくらべると
わかりやすいですね、C言語って。

MSXでアセンブラ使ってたころが懐かしいです。


262 名前: デフォルトの名無しさん 投稿日: 02/04/14 02:49
このスレ殆ど学生しかいないのか?



263 名前: デフォルトの名無しさん 投稿日: 02/04/14 03:03
>>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言語をどのように使うかは全く自由ですが、せっかくですからポインタを自由
自在に扱いたいですね。


267 名前: デフォルトの名無しさん 投稿日: 02/04/14 03:27
>>265
ありがとよ。


268 名前: デフォルトの名無しさん 投稿日: 02/04/14 04:34
Ultra-Cってソフトあったんですけど、これだけでC勉強する
には、十分ですか?


269 名前: デフォルトの名無しさん 投稿日: 02/04/14 04:47
充分


270 名前: デフォルトの名無しさん 投稿日: 02/04/14 04:50
>>268
Cのインタプリタ? 入門にはいいんじゃないかな。使った事無いけど。
これから買う事はお薦めしないけど、持ってるなら有効に活用すべし。

但し、勉強に十分とは言えないかと。
せめてCの基本的な文法とか覚えたら、さっさとbc++やgccに移行して
コンパイラに慣れておく事をお薦めする。


271 名前: デフォルトの名無しさん 投稿日: 02/04/14 05:08
>>269 >>270
サンクス。とりあえず、これで勉強します。


272 名前: デフォルトの名無しさん 投稿日: 02/04/14 05:21
コンパイルエラーが一番の先生だと思わないか?


273 名前: デフォルトの名無しさん 投稿日: 02/04/14 05:27
>>272
カコヽ(`Д´)ノイイ


274 名前: デフォルトの名無しさん 投稿日: 02/04/14 05:41
>>273
カコイイかもしれないけど、Cだとコンパイラのエラーメッセージで学習は無理だろ・・・
gccの-Wallで警告無しでも、気休めにしかならないのがC言語なんだから。


275 名前: デフォルトの名無しさん 投稿日: 02/04/14 06:20
o = --o - o--;

これで必ずoには-1が入るとかアフォなこと言ってた人がいたよぉ
ママーン


276 名前: デフォルトの名無しさん 投稿日: 02/04/14 08:56
これほどまでに、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;
と書く場合とでは、とちらが処理速度が速くまた美しいのでしょうか?



278 名前: デフォルトの名無しさん 投稿日: 02/04/14 10:55
どちらか速いか:たぶんレジスタ上で処理を終えられるかもしれない下の方が、必ずメモリアクセスを発生する上の方より、速いんじゃないかなぁ。

どちらが美しいか:そりゃ下の方だろう。上の方が美しいとか思うか?


279 名前: デフォルトの名無しさん 投稿日: 02/04/14 10:58
下のじゃ正しく変換できないがな


280 名前: デフォルトの名無しさん 投稿日: 02/04/14 11:05
関数ポインタですが、あれはどういうときに使うのでしょうか?
アドレスを持った関数、(ポインタ変数の関数版?)ということだと思うのですがいまいち使い方が思いつきません。
用のないときは使わない、ということでよいのかもしれませんが、気になってます。
どういう場合なら使えるのでしょうか?
使用上、効果的な具体的な事例はあるのでしょうか?
環境はWINDOWSXPにVC++6(.NETも一応あります)です。


281 名前: デフォルトの名無しさん 投稿日: 02/04/14 11:06
関数ポインタは関数へのポインタ。


282 名前: デフォルトの名無しさん 投稿日: 02/04/14 11:08
関数のアドレスを持つポインタ、ということですか?


283 名前: デフォルトの名無しさん 投稿日: 02/04/14 11:10
です。関数に関数を渡すときに使います。
K&R の quick sort のとこに確かありました。


284 名前: デフォルトの名無しさん 投稿日: 02/04/14 11:15
>>277
エソディアソの違いは?


285 名前: デフォルトの名無しさん 投稿日: 02/04/14 11:20
少し前からCの勉強はじめたんですが、本のなかに
123を表示するとき
printf("%d\n",123);
と、書いてあるのですがどうして
printf("123");
と、直接書いてはいけないんですか?


286 名前: デフォルトの名無しさん 投稿日: 02/04/14 11:22
いけないことはない。


287 名前: デフォルトの名無しさん 投稿日: 02/04/14 11:26
>>286
ありがと。これから123と普通に書く事にします。


288 名前: デフォルトの名無しさん 投稿日: 02/04/14 11:37
>>284
入れ替えるだけならエンディアソは関係ないと思ふ。


289 名前: 277 投稿日: 02/04/14 11:47
レスありがとうございます。

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

当方素人です。ご教授願います。



290 名前: 277 投稿日: 02/04/14 11:50
>>284
エソディアソとは何でしょうか?




291 名前: デフォルトの名無しさん 投稿日: 02/04/14 11:53
C言語(C++,VCは抜く)だけだと、どの程度のゲームが作れますか?
画像をある程度使ったものなども作れるのでしょうか?


292 名前: デフォルトの名無しさん 投稿日: 02/04/14 12:00
>>277
上: エラー「メモリがreadになりませんでした」
下: 正常に変換されなかった

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

エンディアン: http://yougo.ascii24.com/gh/00/000012.html


293 名前: デフォルトの名無しさん 投稿日: 02/04/14 12:01
ANSI C には、画像を扱うライブラリは規定されていませn。残念です。


294 名前: デフォルトの名無しさん 投稿日: 02/04/14 12:04
>>293
なるほど。
ではVC++までいかないと無理ですか?


295 名前: カツオ 投稿日: 02/04/14 12:32
UNIXでCプログラミングを始めたいのですが、
Linux、FreeBSD、NetBSDのどれにしたらいいと思いますか?


296 名前: デフォルトの名無しさん 投稿日: 02/04/14 12:36
どれでも。


297 名前: デフォルトの名無しさん 投稿日: 02/04/14 12:38
>>294
標準として規定されてない(つまり、全てのOSで共通に使える画像ライブラリは
無い)けど、特定のOS用の画像ライブラリはくさるほどあるから、
心配すんな。

どの程度のゲームが作れるかについては、君が見たことのある
全てのゲームは、どうにかして作れるから安心したまい。


298 名前: デフォルトの名無しさん 投稿日: 02/04/14 12:42
>>295
どれでもいんだけど、あえてオレらに決めてほしいのなら、
NetBSDにしとけ。


299 名前: デフォルトの名無しさん 投稿日: 02/04/14 12:51
無難なところでFreeBSDだろ。
ミーハーで派手好きならLinuxでもいいかもしれんが。


300 名前: デフォルトの名無しさん 投稿日: 02/04/14 13:05
>>295
つーことで、サイコロ持ってる?無かったら鉛筆でもいんだけど・・・


301 名前: 277 投稿日: 02/04/14 13:25
>>292
うろ覚えでコードを書いていました。

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

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

>エンディアン
ご教授ありがとうございます。
エンディアンの変換でこの処理が必要になりました。



302 名前: デフォルトの名無しさん 投稿日: 02/04/14 13:28
>>297
ありがとうございます。
ソフトによってOSが決まってたりするのはそういうことなんですね


303 名前: デフォルトの名無しさん 投稿日: 02/04/14 13:47
>>302
む?


304 名前: デフォルトの名無しさん 投稿日: 02/04/14 13:48
>>301
面倒だから、htons/ntohsで変換しちまえ


305 名前: デフォルトの名無しさん 投稿日: 02/04/14 14:05
>>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;
}
こんな感じ。


306 名前: デフォルトの名無しさん 投稿日: 02/04/14 14:08
>>301
なんで美しい、にこだわるの?


307 名前: デフォルトの名無しさん 投稿日: 02/04/14 14:10
>>305
オブジェクト指向ごっこもできるよね。



308 名前: デフォルトの名無しさん 投稿日: 02/04/14 15:37
美しいつーか見易さだろ
高級言語は


309 名前: デフォルトの名無しさん 投稿日: 02/04/14 15:44
>>306
美しいものを嫌いな人がいて?


310 名前: デフォルトの名無しさん 投稿日: 02/04/14 15:48
アヒル本ってどうなの?わかりやすい?


311 名前: デフォルトの名無しさん 投稿日: 02/04/14 16:24
Cの標準関数のstrstrってありますよね?
文字列から指定文字列を見つけるアレです。
もしアレをオリジナルの関数で作るとしたら
どうなるでしょうか?
string.hの中身見てもさっぱりで…
どなたか作れる人いたら教えて


312 名前: デフォルトの名無しさん 投稿日: 02/04/14 16:26
>>311
ポインタを使いましょう


313 名前: デフォルトの名無しさん 投稿日: 02/04/14 16:28
K&R読めば作り方分かる。


314 名前: デフォルトの名無しさん 投稿日: 02/04/14 16:28
効率のことさえ考えなければ、こんな感じ?
char* mystrstr(char* a, char* b)
{
  while(*a){
    if(strcmp(a, b) == 0){
      return a;
    }
    ++a;
  }
  return NULL;
}


315 名前: デフォルトの名無しさん 投稿日: 02/04/14 16:29
constくらいつけろよ...



316 名前: 311 投稿日: 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を使ってるんですけど仮引数が多すぎるって警告でるんですけど問題ないですかね?


318 名前: デフォルトの名無しさん 投稿日: 02/04/14 16:35
>>317
いや、関数によって決まってるんだろうが…
あんまり引き渡しても
引渡し側が使えないぞ?


319 名前: デフォルトの名無しさん 投稿日: 02/04/14 16:36
普通警告じゃなくてエラーが出るような・・・
仮引数→引数、なら理解できるが・・。


320 名前: デフォルトの名無しさん 投稿日: 02/04/14 16:55
プロトタイプと引数の数が合ってないだけじゃないのか?


321 名前: デフォルトの名無しさん 投稿日: 02/04/14 16:59
>>317
引数が多くて警告なんかされたことないから
わからんな…
なんか関数I/Fの設計がまずい気もするけども。
構造体を利用するのも一つの手だな。


322 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:04
一つの関数で一つ以上のことはするな、と
お父さんかお母さんに教わらなかったのか?



323 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:13
>>316
まず返却値の型が違うな。char *で返してやらないとどこでマッチ
したのかわからないじゃない。それから12行目のreturn NULLが
おかしいな。ここはbreakでforループを抜けるんじゃないか?
他にも問い詰めたい部分はあるが、こんだけ直せば動くんじゃない?


324 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:15
>>316
変数名をもうちこっと何とかしてホスィ・・・。


325 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:21
>>317
実引数の間違いじゃないのか? そうじゃないなら警告コードをさらせ。


326 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:21
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;
}
なんか違ったらスマソ


327 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:32
>>326
string.h をインクルードしたくないって言ってるんだから、
strlen()も使えないんじゃない?


328 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:40
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;
}



329 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:41
コッチだ、スマソ

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 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:42
━(゚Д゚;)━>
     グサッ
マアイイヤソノクライ


331 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:45
>>330
どうした?


332 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:48
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 使うべきっすね。


333 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:49
>>329
なるほろ!
毎回比較する必要はないのか!


334 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:50
>>329
どっかのMLで見たソースだな、そりゃ(藁

>>332
それは文字列が長くなると遅いな


335 名前: 326 == 330 投稿日: 02/04/14 17:55
>>326のstrstrの前に
int strlen(char *p){int l;for(l = 0;p[l];l++) return l;}


336 名前: デフォルトの名無しさん 投稿日: 02/04/14 17:56
>>329のソースは比較対照が十分長くないと逆に遅くないか?


337 名前: デフォルトの名無しさん 投稿日: 02/04/14 18:00
>>329
うわ,なるほど,一種のハッシュみたいな感じかー。
実はたった今,マッチング処理の速度向上に苦しんでたんスよー。


338 名前: デフォルトの名無しさん 投稿日: 02/04/14 18:03
>>336
最初のstrlenの長さで処理を振り分ければいいかな。


339 名前: デフォルトの名無しさん 投稿日: 02/04/14 18:09
>>337
ハッシュじゃBM法の方が早いだろ。


340 名前: デフォルトの名無しさん 投稿日: 02/04/14 18:15
文字列の比較は多バイト一度にできるビッグエンディアンのほうが効率的?


341 名前: デフォルトの名無しさん 投稿日: 02/04/14 18:20
専用の命令のあるx86 CPUが効率的
>REPE CMPSB


342 名前: デフォルトの名無しさん 投稿日: 02/04/14 18:34
>>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;
}
}



347 名前: デフォルトの名無しさん 投稿日: 02/04/14 23:37
もしCの文法がわかってて、それくらい自力で解決できないなら、
プログラマになるのはやめておいたほうがいいと思われ。


348 名前: デフォルトの名無しさん 投稿日: 02/04/14 23:44
main()
{
/* 空のlpheadを宣言する */
LIST *lphead = NULL;

/* リストに要素を挿入する */
lphead = InsertItem(lphead, 20);
return 0;
}



349 名前: デフォルトの名無しさん 投稿日: 02/04/14 23:46
いや、誰でも通ってきた道なんでないの?

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

とりあえずどういうデータを入力したのかも書け。



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);



351 名前: デフォルトの名無しさん 投稿日: 02/04/14 23:55
>>344
うちではちゃんと動いてるよーん。


352 名前: デフォルトの名無しさん 投稿日: 02/04/14 23:56
例えば、
1,2,3,4,5,6,7,8
と入力すると
2,1,3,4,5,6,7,8
ってなる。


353 名前: デフォルトの名無しさん 投稿日: 02/04/14 23:57
これさ、双方向リストなの?
なんかかなり間違ってる気がするんだけどもよ。



354 名前: デフォルトの名無しさん 投稿日: 02/04/14 23:58
>>351
マジ?
コピペして実行したんだが・・・。


355 名前: 351 投稿日: 02/04/15 00:01
>>354
ごめん。1〜8だと確かにそうなる。
while()で挿入位置を決めてるところが不完全だーね。
ちと修正中。


356 名前: 351 投稿日: 02/04/15 00:04
while()のとこはどうしようもなかったので、先頭挿入時の条件追加でかんべん。
/* 先頭挿入のケース */
if (lptemp->prev == lptemp && lptemp->data >= x)


357 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:04
>>344に仕事を発注しちゃ逝けない。
>>344にデバッグもさせちゃ逝けない。



358 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:05
誤爆鬱ハンギングマイネック


359 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:08
>>356
サンクス!
今、リスト構造使って住所録作ってるんだけど
別に双方向であるひつようないな・・・。
もうちと勉強しなおしてキマス・・・。


360 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:09
先頭だろうが末尾だろうが、
場合分けしてるあたりで三流コーディングの気配。



361 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:11
>>360
柏原正三って三流なのか?


362 名前: 351 投稿日: 02/04/15 00:12
>>360
漏れもそう思った。
でも、先頭と末尾にダミーがないから、しょうがなかった。
えーん。


363 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:31
>>361
俺的には独習Cの評価はかなり下。
素人に分からせるためにわざとダメコードを書いてる節が見える。



364 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:35
赤ん坊にあかちゃん言葉教えてしまうと
まともな言葉を覚えるのが遅れるってやつか


365 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:39
>>361
三流


366 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:40
柏原正三の本、いちども読んだことないな。
例外かもしらんが、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;
}
}


369 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:49
>>367
漏れもNULL大好き。ぬるぬる。はふぅ。


370 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:51
>>369
うん。さっきの環状のリストの修正だけど、まだおかしい所があるよ。
同じ値を2回以上入れるとリスト構造が壊れてしまう。


371 名前: デフォルトの名無しさん 投稿日: 02/04/15 00:51
>>お前だめだよそんなことしちゃ...


372 名前: デフォルトの名無しさん 投稿日: 02/04/15 01:32
NULL NULLに挿入・・・(;´Д`)…ハァハァ


373 名前: デフォルトの名無しさん 投稿日: 02/04/15 02:23
int a = ( 1, 2, 3 );
という文でaに3が代入されるのですが、なぜそうなるのか、なぜコンパイルエラーにならないのか教えてください。


374 名前: デフォルトの名無しさん 投稿日: 02/04/15 02:26
>>373
そういう文法だからだYO!
,演算子調べる!


375 名前: デフォルトの名無しさん 投稿日: 02/04/15 02:27
>>373
','で区切られた式の評価は左から右へ。
よって、(1,2,3)は3に等しい。


376 名前: デフォルトの名無しさん 投稿日: 02/04/15 02:35
そう、そして式としての値は左オペランドのものだから。


377 名前: デフォルトの名無しさん 投稿日: 02/04/15 02:45
>>373
多分最適化によって1と2は無視されるケースが多いと思われ。


378 名前: デフォルトの名無しさん 投稿日: 02/04/15 02:45
右だった(;´-`)
お箸持つほうが値になるの,わかったわね


379 名前: デフォルトの名無しさん 投稿日: 02/04/15 02:52
>>378
は〜い。わかりまちた。ちぇんちぇい〜


380 名前: デフォルトの名無しさん 投稿日: 02/04/15 05:26
>>329
printf("%s\n",str_str("mystrstr","str"));とやったら、strstrと表示されるはずだよね?
(null)って表示されるんだけど(Linux+gcc)。
何やってもNULLが返るんじゃないの?

コンパイルできないから全角スペースは半角スペースに置き換えたけど、それ以外はいじっていない。


381 名前: デフォルトの名無しさん 投稿日: 02/04/15 07:12
>>380
作ってもらって感じ悪いね。
うごかなけりゃ修正すればいい。
骨組みも方針もある。


382 名前: デフォルトの名無しさん 投稿日: 02/04/15 07:17
>>381
つくってもらって?
俺は質問者じゃないけど。


383 名前: デフォルトの名無しさん 投稿日: 02/04/15 07:20
というか作ったんじゃなくてコピペしただけでしょ。


384 名前: 名無しかも 投稿日: 02/04/15 08:21
配列を使うときは、
 
     要素型名 変数名[要素数]

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


385 名前: デフォルトの名無しさん 投稿日: 02/04/15 08:23
要素型名 *変数名;

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

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

しなさい。



386 名前: デフォルトの名無しさん 投稿日: 02/04/15 08:30
>>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;
}



387 名前: 384 投稿日: 02/04/15 08:37
早いレスありがとうございました♪


388 名前: デフォルトの名無しさん 投稿日: 02/04/15 10:56
>>159
ていうか、あからさまにキーワード「typedef」が使われる由。
Type を define してるんだヨって、思いっきり言ってやりたいよね。
やっぱ、エラー等のメッセージも >>133 は無視してるんだろね。


389 名前: デフォルトの名無しさん 投稿日: 02/04/15 11:02
なぜ今更>>159に。。。


390 名前: デフォルトの名無しさん 投稿日: 02/04/15 11:04
>>385
見て思ったんだけど
#include <stdlib.h>
すれば
malloc()
はキャストしなくてもいいんでしょ?だめ?



391 名前: 名無しさん@お腹いっぱい。 投稿日: 02/04/15 11:54
ファイルを読んだり書いたりするのは
fprintfとかfwrite,freadでやっているのですが、
ファイルの消去はどうすれば良いのでしょう?
今は
system("/bin/rm -f hoge");
ってやっているのですが、これだとrmコマンドが/bin の下に無い場合エラーが出てしまいますし・・・


392 名前: デフォルトの名無しさん 投稿日: 02/04/15 11:57
remove


393 名前: デフォルトの名無しさん 投稿日: 02/04/15 11:58
unlink()


394 名前: デフォルトの名無しさん 投稿日: 02/04/15 11:58
stdio.h に
int remove( const char* filename )
ってないか?
ANSIのはずだけど。


395 名前: デフォルトの名無しさん 投稿日: 02/04/15 12:02
>>394
unlinkが一般的でなかったかい?


396 名前: デフォルトの名無しさん 投稿日: 02/04/15 12:02
unlinkはunixだろ


397 名前: デフォルトの名無しさん 投稿日: 02/04/15 12:03
だめ。>>390
stdlibのプロトタイプでもmallocの返値はvoid*だから。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html



398 名前: 390 投稿日: 02/04/15 12:11
>>397
http://www.catnet.ne.jp/kouno/c_faq/c7.html#0

C FAQ 7.7に、ANSI/ISO規格のCでは警告を黙らせるためのキャストは必要ないっ
て書いてあるけど。
警告は出なくても問題はある、ってことですよね。例えばどんな時?



399 名前: デフォルトの名無しさん 投稿日: 02/04/15 12:13
>>398
いろんな環境でコンパイルできるようにするには、キャストしといたほうが
いいかも。なんとなく。


400 名前: デフォルトの名無しさん 投稿日: 02/04/15 12:21
>>399
それ言い出したらきりがないべ。


401 名前: 391 投稿日: 02/04/15 12:24
>>392-396
ありがとうございます。
remove はstdio.h 、unlink はunistd.hでした。

Linux上でmanを見ると
>removeはファイルシステムからファイル名を削除する。ファイルに対しては unlink を、ディレクトリに対しては rmdir を呼び出す。
と書いてありましたので、remove を使えば問題ないですね。



402 名前: デフォルトの名無しさん 投稿日: 02/04/15 12:48
>>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;
としてやってみろ。



405 名前: デフォルトの名無しさん 投稿日: 02/04/15 14:47
scanfの戻り値を見ていないので、それが失敗していることが分からない。

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


406 名前: デフォルトの名無しさん 投稿日: 02/04/15 15:56
> 本の見本では

何の説明もなくそんなサンプルと実行結果を挙げているなら、その本がタコ。
「このような結果になるのでscanf()の戻り値チェックを忘れるな」という
説明が付いていてそれを見落としていたなら、>>403がタコ。



407 名前: デフォルトの名無しさん 投稿日: 02/04/15 16:41
タコ本は焼き捨てろ。


408 名前: デフォルトの名無しさん 投稿日: 02/04/15 16:50
見本にわざわざ値がでてるのはやっぱり
「こんなぐちゃぐちゃなことになるぞ」って例じゃないかと推測。
それなのに「ぐちゃぐちゃ」部分が一致しないって騒いでるんじゃないのか?


409 名前: デフォルトの名無しさん 投稿日: 02/04/15 16:52
ハァハァ(゚з゚)


410 名前: デフォルトの名無しさん 投稿日: 02/04/15 16:56
その本の「自動変数」のページよんでないだろ


411 名前: 403 投稿日: 02/04/15 17:17
自分がアポだったようです。
お騒がせしまし


412 名前: デフォルトの名無しさん 投稿日: 02/04/15 17:53
>>311
*.h の中身見て
処理のアルゴリズムが分かると思ってるのかyp!


413 名前: デフォルトの名無しさん 投稿日: 02/04/15 18:41
実はインライン関数かも知れん(違



414 名前: デフォルトの名無しさん 投稿日: 02/04/15 18:47
Winmain()から、Dialogを作成するじゃないですか。
そのダイアログにリソース上のBitmapを描画するにはどうすればいいですか?


415 名前: デフォルトの名無しさん 投稿日: 02/04/15 19:34
いま望洋さんの本で勉強しているのですが、基本型って難しいですね。
C言語はポインタの理解でつまずきやすいと聞いていたのですが、
その前に挫折しそうです。


416 名前: デフォルトの名無しさん 投稿日: 02/04/15 19:47
>>414
簡単簡単。
http://kumei.ne.jp/c_lang/sdk/sdk_26.htm
http://kumei.ne.jp/c_lang/sdk/sdk_13.htm
を見よ。
つーか、リソースエディタでぺけっと張りつけとくってのもイイ。


417 名前: デフォルトの名無しさん 投稿日: 02/04/15 19:50
>>311
オリジナルで作る必要はない。というか、既にあるものを作ってはいけません。
バグが出るだけです。
(勉強のため、ってんなら、もちろん構わないけど)

http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/string/?lang=ja
ここらへんからパクりなさいな。


418 名前: デフォルトの名無しさん 投稿日: 02/04/15 19:52
いま出回ってる「Cの絵本」って
なかなかわかりやすくて良かったですよ。
ただこの本のほかに辞書的な本は絶対に必要ですけど。



419 名前: デフォルトの名無しさん 投稿日: 02/04/15 21:15
414です。
あっと、リソース上というのはリソースエディタで書いたもののことです。
ぺけっと…といわれてもいまいち解らないのですが教えていただけますか?


420 名前: 416 投稿日: 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


421 名前: デフォルトの名無しさん 投稿日: 02/04/15 23:10
>>417
標準のstrstrはものすごく非効率だったりするから、
場合によっては作った方がいい


422 名前: 417 投稿日: 02/04/15 23:19
>>421
そういうときは、効率がいいものをパクろう。


423 名前: デフォルトの名無しさん 投稿日: 02/04/16 08:04
>>421
非効率でもいいじゃん。


424 名前: デフォルトの名無しさん 投稿日: 02/04/16 08:49
>>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()とやるとおかしくなるという以外に
何か問題ありますか?


427 名前: デフォルトの名無しさん 投稿日: 02/04/16 11:06
常に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のメリット、デメリットって何ですか?



429 名前: デフォルトの名無しさん 投稿日: 02/04/16 14:34
>>428
そんなのあるの?別にないんでわ?


430 名前: デフォルトの名無しさん 投稿日: 02/04/16 15:16
whileの方が可読性が高い


431 名前: デフォルトの名無しさん 投稿日: 02/04/16 15:18
>>430
場合によるじゃん。



432 名前: デフォルトの名無しさん 投稿日: 02/04/16 15:26
>>428
メリット・デメリットと言われると違和感があるが、

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

という違いはあるわな。for文でうまく記述できる処理は
for文で書いた方がすっきりするんでない?


433 名前: 428 投稿日: 02/04/16 15:28
そっかぁ・・・・。
なるほど、わかりました。サンクス


434 名前: デフォルトの名無しさん 投稿日: 02/04/16 15:32
for(;;) と while(1) のどっちがいいか、っていう話かと思った。


435 名前: デフォルトの名無しさん 投稿日: 02/04/16 15:38
>>434
無条件ループならfor(;;)のほうが条件がない感じがはっきりしてていいなあ。

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

C99 or C++なら、while(true)にすることで印象は改善するが…。


436 名前: デフォルトの名無しさん 投稿日: 02/04/16 15:59
forにするかwhileにするかはかなり好みの問題である。
forは明らかに、一つの単純な初期化
およびインクレメントのあるときに最も有利である。

↑これが全て。


437 名前: デフォルトの名無しさん 投稿日: 02/04/16 16:47
>>435
一応、真偽を返す標準関数は真の場合1を返すことに決められてるけど。
だめ?


438 名前: デフォルトの名無しさん 投稿日: 02/04/16 17:02
is_*系の判別するのは標準関数やないの?



439 名前: デフォルトの名無しさん 投稿日: 02/04/16 17:05
>>435
while (1e-99) のように、浮動小数点でも無視されるようですね。結局
非0でなければ何でもよいのか。


440 名前: デフォルトの名無しさん 投稿日: 02/04/16 17:38
そらそうでしょ


441 名前: デフォルトの名無しさん 投稿日: 02/04/16 17:39
そらそうじゃないや(w


442 名前: デフォルトの名無しさん 投稿日: 02/04/16 17:48
>>441
そうであります。「非0でなければ」ではなく、「非0であれば」ですよね。


443 名前: 437 投稿日: 02/04/16 17:54
>>438
例外もあったと思う。差を返すstrcmpとか。
あと、ANSI C言語辞典には、
論理演算(ビット演算ではない)は、真の時1
と書いてあった。


444 名前: デフォルトの名無しさん 投稿日: 02/04/16 17:58
1は真だが真は1じゃない。


445 名前: デフォルトの名無しさん 投稿日: 02/04/16 17:59
>>444
必要条件を満たしているが十分条件ではない。


446 名前: デフォルトの名無しさん 投稿日: 02/04/16 18:03
9割9分あり得ないとは思うが、将来的に1が真でなくなる時も来る可能性はある。
実際C#では(以下略)


447 名前: デフォルトの名無しさん 投稿日: 02/04/16 18:04
>>444
もちろん、判定の時は非0が真、真は非0なんだけど、
式の評価値や関数の戻り値としては、「真なら1を返す」ってのが決まってるものも
あるんだよ。


448 名前: 437 投稿日: 02/04/16 18:08
すまん。嘘ついた。
標準関数が1を返すってのは根も葉もない妄想でした。ごめんちゃい。
http://www.bpel.tutics.tut.ac.jp/~take/basement/faq-c/faq-c8.html
のA8.2に「組み込みの演算子」って書いてあった。


449 名前: デフォルトの名無しさん 投稿日: 02/04/16 20:05
for(ex1;ex2;ex3)はcontinueしるとex3が忘れずに実行できて便利。


450 名前: デフォルトの名無しさん 投稿日: 02/04/16 20:54
Cを勉強しようと思っています。
手本になるものを見ながら覚える方がよいと考えているのですが
良いサンプルになる素材というのはあるのでしょうか?
それとも、皆さんは一から書き始めたのでしょうか?

アフォな質問で申し訳ありません。


451 名前: デフォルトの名無しさん 投稿日: 02/04/16 20:55
>>450
文法知らずに文章書くのって無理です。読むのもママなりません。


452 名前: デフォルトの名無しさん 投稿日: 02/04/16 21:00
#ifdef DEBUG
#define debug_print printf
#else
#define debug_print 1 ? 0 : printf
#endif


453 名前: デフォルトの名無しさん 投稿日: 02/04/16 21:31
>>450
http://tito.fc2web.com/2ch/tech/index.html


454 名前: デフォルトの名無しさん 投稿日: 02/04/16 21:39
case VK_SPACE
とかくといまくいきますよね。
キーボードのボタンの場合、

case A
としてもうまくいきません。
どうすればいいのでしょうか?


455 名前: デフォルトの名無しさん 投稿日: 02/04/16 21:50
>>416
414
う〜ん。いやコントロールは…というのは場合によって
描画座標や横幅を変えたいのですが…。
それで詰まっているのです。たびたび申し訳ないです。


456 名前: デフォルトの名無しさん 投稿日: 02/04/16 22:05
>>454
case 'A' ってことかい?


457 名前: 414 投稿日: 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
を使うのがいいと思うけどね。


458 名前: デフォルトの名無しさん 投稿日: 02/04/16 22:25
>>456
ありがとうございました
みごとに解決しました


459 名前: デフォルトの名無しさん 投稿日: 02/04/16 22:49
いくらなんでもちょっとヒドすぎる質問が多いような気が…


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() )

と表示されます。なにが悪いんでしょうか?


463 名前: デフォルトの名無しさん 投稿日: 02/04/16 23:01
>>462
コンパイラは何ですか?古いC++だと、<iostream>のようなstd名前空間の
インクルードが使えないことがある。その場合は<iostream.h>とすればよい。

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


464 名前: デフォルトの名無しさん 投稿日: 02/04/16 23:23
>>462

ここはCスレだっていうの(略)


465 名前: デフォルトの名無しさん 投稿日: 02/04/16 23:33
>>462
コンパイラは?



466 名前: デフォルトの名無しさん 投稿日: 02/04/16 23:35
>>461
ここはCスレなので、もちろんSDK。
でもあくまでCスレなので、SDK特有の質問されても困っちゃう。


467 名前: 462 投稿日: 02/04/16 23:45
できました。後者が原因でした。ありがとうございます。
ちなみにコンパイラはBorlandC++Compilerでした。

スレ違いの質問してしまったようですね。すみませんでした。


468 名前: デフォルトの名無しさん 投稿日: 02/04/17 01:01
int main(int argc, char **argv)
int main(int argc, char *argv[])
どっちが正しいの?


469 名前: デフォルトの名無しさん 投稿日: 02/04/17 01:07
どっちも正しいよ。>>468


470 名前: デフォルトの名無しさん 投稿日: 02/04/17 01:13
Cにおいて関数仮引数の
char *p
char p[]
は全く同じ。
したがって>>468のは両方同じ
俺はchar**派


471 名前: デフォルトの名無しさん 投稿日: 02/04/17 01:43
もうしわけありません
初歩的すぎてもしかしたら怒られるかも知れないのですが、質問させてください
スレ違いでしたら申し訳ありません

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);

見た目の症状としては、エディットボックスのスクロールバーが一番下までいきません
それ以上に文章があるはずなのに、スクロールバーはすでに一番下でこれ以上下にいかない。となります
もしよろしければ回避法など教えていただけると幸いです


472 名前: デフォルトの名無しさん 投稿日: 02/04/17 01:49
Windowsの制限では?
スレ違いだが。


473 名前: デフォルトの名無しさん 投稿日: 02/04/17 01:50
>>471
Winのエディットボックスは64kbまでだと思うたが。(違ってたらスマシ)
それ以上書き込んでるってこと?


474 名前: デフォルトの名無しさん 投稿日: 02/04/17 01:54
制限があるのは9x系のみ。

スクロールについては、推測だが
スクロールバーの解像度以上の行数を流し込むと当然1pxごとに
2行以上スクロールすることになり、位置とスクロールバーの(見た目)位置が同じでも
実際には幅があるってことじゃないか?


475 名前: 468 投稿日: 02/04/17 02:04
>>469>>470
ありがと。
ポインタへのポインタだから一緒だよねぇ…
教授に注意されてチョト自信なかったから聞いてみたのです。


476 名前: デフォルトの名無しさん 投稿日: 02/04/17 02:17
intの最上位ビットが立っているかを調べるのに
if( i < 0 )
とやるのはOKなんでしょうか?環境依存なく



477 名前: デフォルトの名無しさん 投稿日: 02/04/17 02:22
ダメだろ。


478 名前: デフォルトの名無しさん 投稿日: 02/04/17 02:23
>476
規定外だと思うので、厳密には環境依存するんではないかと。
俺は見た事無いけど。


479 名前: デフォルトの名無しさん 投稿日: 02/04/17 02:25
(INT_MAX + 1) >> 1


480 名前: デフォルトの名無しさん 投稿日: 02/04/17 02:29
 ( ΘρΘ) <私のならいつでも勃ったるが・・・
 (     )
  |   つ |
 ( _)_)


481 名前: デフォルトの名無しさん 投稿日: 02/04/17 02:31
>476
unsigned intでなければOKなんじゃない?明示的にキャストしておくとか。
それとも、素直に((i<<1)>>1 == i)で調べるか。


482 名前: デフォルトの名無しさん 投稿日: 02/04/17 02:40
>>472
スレ違いでしたか。もうしわけございません

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

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

アドバイスありがとうございます


483 名前: デフォルトの名無しさん 投稿日: 02/04/17 03:11
>>476
最上位ビットを調べるのに0より小さいかみるのは正直お勧めしない。
ビット演算子使うべき。


484 名前: デフォルトの名無しさん 投稿日: 02/04/17 03:19
環境依存なし=int幅が不定
という状況で、ビット演算子をどう使う?


485 名前: デフォルトの名無しさん 投稿日: 02/04/17 03:34
>>481の2行目の方法を使えということでは。


486 名前: デフォルトの名無しさん 投稿日: 02/04/17 03:36
環境依存なし
という状況で、最上位ビットを何に使う?


487 名前: デフォルトの名無しさん 投稿日: 02/04/17 03:36
signedならば負かどうか、unsignedなら>>481で桶では?


488 名前: デフォルトの名無しさん 投稿日: 02/04/17 04:41
signedでもunsignedでも、キャストしちまえば片方で済ませられるな。ヤター


489 名前: デフォルトの名無しさん 投稿日: 02/04/17 04:47
念の為、>>481にvolatileつけとけば確実かな。環境によっては最適化間違えるかも。


490 名前: デフォルトの名無しさん 投稿日: 02/04/17 04:47
>>488
intからほかの型に仕様変更されたら(以下略
どちらにせよ最上位ビットってのは汎用性が無いよな。
何番目のビットか明示的に示すべきなのに。


491 名前: デフォルトの名無しさん 投稿日: 02/04/17 05:17
条件演算子?:でしかできたいことってありますか?


492 名前: デフォルトの名無しさん 投稿日: 02/04/17 05:31
>>491
?:は右辺値になれます。
if();else;は値を持ちません。


493 名前: デフォルトの名無しさん 投稿日: 02/04/17 05:54
>>434
while("無限ループだよ")

これが一番わかりやすい。メモリの無駄遣い?


494 名前: デフォルトの名無しさん 投稿日: 02/04/17 05:56
>>492
そうなのか、ありがとう。


495 名前: デフォルトの名無しさん 投稿日: 02/04/17 06:06
ありがとうage


496 名前: デフォルトの名無しさん 投稿日: 02/04/17 07:52
>>484
intの幅なら CHAR_BIT * sizeof(int) で出んか?


497 名前: 麗恵香 投稿日: 02/04/17 07:54
魔法のiらんどでつくったHP不正に改ざんされてパスワード変えられた。
誰か不正アクセスの仕方とか教えてください。お願いします。



498 名前: デフォルトの名無しさん 投稿日: 02/04/17 08:09
>>493
それいいな


499 名前: デフォルトの名無しさん 投稿日: 02/04/17 08:57
イイカ? w


500 名前: デフォルトの名無しさん 投稿日: 02/04/17 08:58
500get!


501 名前: デフォルトの名無しさん 投稿日: 02/04/17 09:02
>>496
intのビット数はCHAR_BITの整数倍とはかぎらないというワナ


502 名前: デフォルトの名無しさん 投稿日: 02/04/17 09:55
>>501
整数倍だが?
いや、正確にはsize_t倍か。
size_tって実数でもいいんだっけ?


503 名前: ぼうようマンセー 投稿日: 02/04/17 10:06
>>502
http://www.bohyoh.com/CandCPP/FAQ/FAQ00018.html


504 名前: デフォルトの名無しさん 投稿日: 02/04/17 11:30
おい!お前ら!
プログラミング言語C(K&R)なんてどこにも売ってないじゃないか!
古臭い本紹介しやがって、だましたな!1は謝罪しる!

# 漏れは某アンチK&Rスレの1ではありませんが、
# 今までいくつかの本屋を回ったがマジでK&Rはどこにも売ってねぇ。
# ネットで買うのもいいかもしれんが、そんなマイナーな本には期待できねーな。


505 名前: デフォルトの名無しさん 投稿日: 02/04/17 12:03
読んでもお前にはわからんから安心しろ。


506 名前: デフォルトの名無しさん 投稿日: 02/04/17 12:10
>>504
SunKAMATAの本屋にはあった。


507 名前: デフォルトの名無しさん 投稿日: 02/04/17 12:25
K&Rをマイナー呼ばわりするヤツ初めて見た。
どこを突っ込んでいいのかわからん。


508 名前: デフォルトの名無しさん 投稿日: 02/04/17 12:28
ケツに突っ込め!


509 名前: 日下部陽一 投稿日: 02/04/17 12:33
> 古臭い本紹介しやがって、だましたな!1は謝罪しる!

ごめんなさい。
作ってわかるCプログラミングのほうをどうぞ。


510 名前: デフォルトの名無しさん 投稿日: 02/04/17 12:37
>>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をクソと認めない老人ホーム集団のスレはここですか?



513 名前: デフォルトの名無しさん 投稿日: 02/04/17 12:48
K&Rを読めないからやつあたりしちゃってる厨房がまぎれこんだというスレは
ここですか?


514 名前: デフォルトの名無しさん 投稿日: 02/04/17 12:49
>>512
訳に関してなら言いたいことは沢山あるが、
内容に関しては年代など関係なくスバラシイ。


515 名前: デフォルトの名無しさん 投稿日: 02/04/17 12:51
>>512
カーニハンとリッチーには足を向けて寝れませんが何か?


516 名前: デフォルトの名無しさん 投稿日: 02/04/17 12:53
アオラーは相手にしないように。


517 名前: デフォルトの名無しさん 投稿日: 02/04/17 13:00
>>504
> プログラミング言語C(K&R)なんてどこにも売ってないじゃないか!
確かに1版はどこにも売ってないね。(緑色の表紙の奴)
古臭い本だからね。



518 名前: デフォルトの名無しさん 投稿日: 02/04/17 13:08
K&Rも英語で読めないアフォがあつまるスレはここですか?




519 名前: デフォルトの名無しさん 投稿日: 02/04/17 13:34
般若心経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 を使い切らない
処理系があってよいということか?ほう。


522 名前: デフォルトの名無しさん 投稿日: 02/04/17 14:28
>>521
言われてみれば12ビットってのはおかしいな。
31ビットとか半端なintもありえるってことだな。


523 名前: デフォルトの名無しさん 投稿日: 02/04/17 14:30
CHAR_BITが9で、intが32ビットとかもありそう。


524 名前: デフォルトの名無しさん 投稿日: 02/04/17 14:38
そういうイビツな処理系にお目にかかりたい。

最近はWintelマシンばっかいぢってる。


525 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:13
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回も処理されるんでしょうか?



526 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:16
>>525
3回ループしてるって事だろ?


527 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:22
>>517
第1版の表紙は緑じゃなくて白だよ。
ANSI C規格が出来る前なので、内容的には相当古いですな。

コンピュータ関連書籍の中でも異例なほどのロングセラーで、確か
第100刷以上行ってたはず。これの初版第1刷とか持ってたら自慢できるかも。



528 名前: デフォ七 投稿日: 02/04/17 15:29
register 変数にmemsetで値を書こうとすると警告が出るのだが・・・
レジスタのアドレスは取得できません
だってさ。
一応実行ファイルはできてるようだが怖い。
これって大丈夫なのか?
ちなみにSolaris7&Sunのccコンパイラです。



529 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:29
>>525
内側は最終的に5×3=15回処理されます。


530 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:30
>>527
いや、そりゃそうだろ・・・・C++じゃないんだから。


531 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:31
>>528でした。スマソ。
C言語ではregister変数のアドレスは取れないよ。C++ならOKだが。


532 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:31
>>528
指定通りにレジスターにおかれたらまずいんじゃない?
よくわからないけど。

しかし配列をレジスターにおくのはいかがなものかと・・・


533 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:33
>>531
C++ではregisterをつけてもアドレスを取ろうした場合は必ずメモリー上にデータが配置されるの?


534 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:35
>>524 全て32bitって処理系をやっています CHAR さえも


535 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:36
>>534
1byte=32bitなの?
charが大文字なのが気になるけど・・・


536 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:39
>>531
必ずというか、register指定が無視される。


537 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:40
>>526
外のforの処理をしたら、内のforの処理が起きますよね。
そうした場合jの値が増えてjが2の時、処理が終わると思うんですが
外のforの2回目の処理の時もまた、内側のforも処理され始めたんで
す。1回目でjの値は2になったのに、何でまたj=0の状態から始まるの
かがわかんなかったんです。
説明下手ですいません。


538 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:41
>>533
アドレスを取る所ではメモリ上から取るが、最適化によってレジスタ変数
が使われる場合もある。


539 名前: 535 投稿日: 02/04/17 15:42
>>535 メモリアドレス単位が32bitなので char も32bitです


540 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:43
>>537
jが3の時、処理が終わる。なぜまたj=0から始まるかというと、
for(j=0; j<3; j++){
~~~~
ここでjに0を代入しているから。


541 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:43
>>537
jが3の時に処理が終わる。内側のループを抜けるからプリントはされないが。


542 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:44
CHAR_BIT == 32
sizeof int == 1



543 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:45
>>537
デバッガの使い方おぼえて、変数の内容を確認しながらステップ実行してみ
なされ。


544 名前: 537 投稿日: 02/04/17 15:46
>>540 >>541
なるほど、わかりました。jが2になった時点でj=2が
記憶されるものだと思ってました。


545 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:47
>>537
> 何でまたj=0の状態から始まるのかがわかんなかったんです。
そういう処理を書いているから

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



546 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:47
>>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;

これでやればきっと思い通りになる。


547 名前: 537 投稿日: 02/04/17 15:48
>>543
デバッガですね。まだ、C初めて3日目なんでこれから
覚えようと思います。有り難うございます。


548 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:49
>>534
float と double は?



549 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:49
>>546
試してみます。


550 名前: デフォ七=528 投稿日: 02/04/17 15:51
そうか、register変数のメモリは取得できんのか…
thx
memsetをやっちゃった場合には処理系依存になるのかしらん。
普通の自動変数に変更されてるのかなぁ?
このへんの動作をprintfで吐かせるにはどんなコード書けばいいのか?


551 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:52
>>549
きっとコンパイラに「警告:初期化されていない変数jを参照しようとしました。」と言われるな。


552 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:54
今時registerなんて書かないもんだ。


553 名前: デフォルトの名無しさん 投稿日: 02/04/17 15:54
>>550
register変数というか、レジスタにアドレスがないから取得できないんじゃないの?registerをつけたからといって必ずしもレジスタに置かれるというわけではないけど。


554 名前: 534 投稿日: 02/04/17 15:57
>>548 floatもdoubleも32bitです。 レジスタ内では実数部32bitの40bitあるんですけどね。



555 名前: デフォ七=528 投稿日: 02/04/17 16:00
>>553
>>552
それは理解できてますよ。
ただ、古いコードをお守りしてる都合上、どうしてもregister変数に
memsetをしてる場合の動作を知りたいんですよ。


556 名前: デフォルトの名無しさん 投稿日: 02/04/17 16:03
>>555
エラーにならずに警告にとどまっているなら、register指定は無視され、
メモリに割り当てられているんでしょう。


557 名前: デフォルトの名無しさん 投稿日: 02/04/17 16:06
>>551
> きっとコンパイラに「警告:初期化されていない変数jを参照しようとしました。」と言われるな。
なぜ?jは定義したときに初期化されているように見えるが?



558 名前: デフォルトの名無しさん 投稿日: 02/04/17 16:09
556に1票。
警告が気になるなら
 #define register
とでもしる。


559 名前: 551 投稿日: 02/04/17 16:09
>>557
悪い。549のレス先を見間違った。
私は>>546>>545とかぶったから、てっきり549は>>545を参考にすると言ったのかと思ったよ。


560 名前: デフォルトの名無しさん 投稿日: 02/04/17 16:34
register てつけることは、コンパイラに対して
「気が向いたらレジスタに割り当ててほしいなあ」
とこちらの意向をお伝えしているにすぎないのでぷ。
何かを保証するようなキーワードではありませんでぷ。

コンパイラはそんなことはまったく無視するかもしれないし、
(可能なら)親切にもそうしてくれるかもしれないし。


561 名前: デフォルトの名無しさん 投稿日: 02/04/17 16:42
>>560
そうなのだが、register変数のアドレスを取ろうとすると、
「さっきレジスタに割り当てて欲しいと言ったのに、なぜアドレスを今更
取ろうとするの?(゚Д゚)ハァ?」というようにコンパイラがだだを捏ねます。

C++なら、「さっきはregisterと言ったけど、アドレスを取りましたね。
ではregister指定は無視しましょう。」となります。


562 名前: デフォルトの名無しさん 投稿日: 02/04/17 16:57
0ページをレジスタ変数に使っているという罠


563 名前: デフォルトの名無しさん 投稿日: 02/04/17 17:02
>>562
CPUは65xxxですか?
というか、0ページも所詮はアドレッシングモードの一つに過ぎないしなあ。
レジスタの極端に少ないCPUでregister指定をしても意味がないかも。
x86もレジスタは少ない方だが、レジスタリネーミングのお陰で結構効果
があがる。


564 名前: デフォルトの名無しさん 投稿日: 02/04/17 17:02
>>561
それは、あなたのコンパイラがそういう仕様なのであって、
全部のコンパイラがそうなのとは違いまぷね。
警告レベルのようなオプションの設定によっても
やかましさは違うでしょうし。

>>562
つまらないでぷ。


565 名前: デフォルトの名無しさん 投稿日: 02/04/17 17:09
>>564
ANSI-Cでregisterと宣言された変数のアドレスは明示的にも暗黙的にも
取れないと、K&R第2版A8.1に書いてありまぷね。


566 名前: デフォルトの名無しさん 投稿日: 02/04/17 17:12
だからなに?


567 名前: デフォルトの名無しさん 投稿日: 02/04/17 17:22
>>566
コンパイラによって、registerのアドレスを取ろうとした時、
エラーにならない処理系は標準ではないのかと小一時間。


568 名前: デフォ七=528 投稿日: 02/04/17 18:06
>>565
そのようですが、現実のところは処理系依存ですね。
SunOS4.1.1のccだと通してしまってるみたい。


569 名前: デフォルトの名無しさん 投稿日: 02/04/17 18:14
>>565
ANSI Cも所詮は規格のひとつにすぎない。
すべてのコンパイラがANSI C準拠だと思うな。


570 名前: デフォルトの名無しさん 投稿日: 02/04/17 18:15
>568
古っ


571 名前: デフォルトの名無しさん 投稿日: 02/04/17 18:24
規格の関係で間違い指摘されると、
規格外のコンパイラもあるって言い出すやつが必ずいるな。
そんなこと言ってたら規格の話題は全部無意味になるよ。


572 名前: デフォルトの名無しさん 投稿日: 02/04/17 18:40
>>571
> 規格の話題は全部無意味になるよ。

そんなことないだろ。
>>565はANSI-Cが全てだというような書き方をしているのが悪いんだ。


573 名前: デフォルトの名無しさん 投稿日: 02/04/17 18:45
今さらって感じですが明解C言語_入門編を購入したのですが
そこでどうでもいい疑問があるので質問させて頂きます。
いままで"return 0;"としてmain関数を締めてたのですが
この本では"return (0);"となっています。
結論としてはどちらでも良いのでしょうが
微妙な違いみたいなものってあるのでしょうか?


574 名前: デフォルトの名無しさん 投稿日: 02/04/17 18:49
return(0)は、retrun(0)のとき(特にCで)
かな〜りしぬるので、おすすめできない。


575 名前: デフォルトの名無しさん 投稿日: 02/04/17 18:50
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 対象となる文字列。
リターン値 文字列の先頭ポインタ。
こんな感じでどなたか教えてください。


579 名前: デフォルトの名無しさん 投稿日: 02/04/17 18:56
>>577
つまり多くのコンパイラはC99はサポートしていないので
「規定外のコンパイラ」と一々付けなければいけないのですね?



580 名前: デフォルトの名無しさん 投稿日: 02/04/17 18:58
>>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;
}



581 名前: 580 投稿日: 02/04/17 19:04
intじゃなくてsize_tの方がよかったか。どうでもいいが。


582 名前: 教えて君 投稿日: 02/04/17 19:07
>>580
あんがとです!!
助かりました♪


583 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:08
>>580
int main(void)
{
  printf("%s\n", strrev("ABCD"));
  return 0;
}
あり、core dumpするぞ?
# こんな使い方する方が悪い?



584 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:08
>>574,575,576

レスありがとう。
結論としてはどちらでも良いが、括弧で括らない方が
一般的なのですね。
これからは今まで通り括弧付けずに逝きます。


585 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:10
>583
strcat("abc", "def");と同程度には。


586 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:10
>>583
あれ?なんか間違った?(汗
# 文字列リテラルを書き換えようとしているからじゃないよね?


587 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:29
>>585
つぅか彼は何がしたいのでしょうか?


588 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:29
>>586
文字列リテラルを書き換えようとしてるじゃん


589 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:30
>>583
あなた、

int *a = 32;

とかして平気な人?


590 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:30
>586
VC6だが"ABCD"はwrittenになれんそうです。

"0x00401086"の命令が"0x00420020"のメモリを参照しました。
メモリが"written"になることができませんでした。


591 名前: なわけねーだろ 投稿日: 02/04/17 19:33
>>589
アドレスのハードコーディングマンセー


592 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:40
数値を入力して16進文字列を作成したいんっす。
でも%xは使用禁止なんですよ(涙
アドバイスください。
おながい


593 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:41
ハッキリ言ってインターフェースが悪い。
char *strrev(char *str);
ではなく
char *strrev(const char *rev, char *str);
とすべきと言ってみるテスト



594 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:42
>>593

×:char *strrev(const char *rev, char *str);
○:char *strrev(char *rev, const char *str);



595 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:43
>>592
65536でわる256で割る16で割る。



596 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:44
>>592
itoaと言ってみるテスト


597 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:48
>>592
%xがだめなら%Xを使え。


598 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:48
>>592
宿題は自分でやれ。


599 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:51
>>592
//テーブル。頑張って作ってね。
char s[][]=("1","2","3",......,"FE","FF".....);

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

scand("%d",&input);

printf("%s",s[12]);
}



600 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:52
>>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]);
ただし、プログラムサイズがやたらでかくなる諸刃の剣



601 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:52
正直、599がchar *s[]ではなく、char s[][]で、しかも("","")という
珍妙なる初期化を行うのはなぜだろうか、と疑問に思う。


602 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:54
600には、
>char *hextbl[9]
をもう一度よく考え直していただきたい。


603 名前: デフォルトの名無しさん 投稿日: 02/04/17 19:53
>>592
宿題まるなげ禁止。
どこまでできて、どこでつまずいてるのかを明記し、

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

こちらへ。


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

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



605 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:03
亀レスになりますが・・・・・

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

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

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

なぜコンパイルが通らないのか、なぜ警告がでるのか?と一人で悩む
ぐらいなら、ああ、これは標準とは違うんだ、で納得できれば、時間も
気苦労も少なくて済みますよね。


606 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:10
>604
ホントに実行してみた?
そのループ、回らなはずだけど‥‥


607 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:11
>>606
回らなはずだけど‥‥


608 名前: 604 投稿日: 02/04/17 20:11
あ、すまん。int i;じゃなくてunsigned int i;じゃないと。



609 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:16
>>604
それから%Xは使用禁止なんよ。


610 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:17
>>606
ホントに実行してみた?
そのループ、回るけど止まらないんだけど・・・


611 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:18
unsigned intは32bit どの環境でも?


612 名前: 604 投稿日: 02/04/17 20:22
ううむ。0xffffffff -> UINT_MAX ですか。



613 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:25
char format= "%%";
format[1]='X';
printf(format,i);
激しくつまらないな‥‥

>604
"FFFFFFFE",
"FFFFFFFF", //←コンパイルエラー
};


614 名前: 604 投稿日: 02/04/17 20:27
>>613
最後のカンマが余計なのはエラーにならないんじゃなかったっけ?



615 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:28
シマッタ、それが有効なのはenumだけだとオモテタ‥‥


616 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:28
>>613
最後のカンマはエラーにならないよ。


617 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:30
C99とC++ではエラーにならないけど。


618 名前: 613 投稿日: 02/04/17 20:32
よし、ここは、569の例に倣って、
「エラーになる俺様コンパイラがある」ってあたりで(自爆)。


619 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:34
つぅかあんたらいい加減にテーブル引きとかバカなこと言わず(発端は俺だが。)。


620 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:38
>>619
馬鹿なことじゃないぞ。
16進数化程度では確かにくだらないが、汎用性を考えると(以下略


621 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:40
いややはり、事実上コンパイルできないのは大きいから、
DBなり、固定長のファイルレコードなりに納めるのが
実用的だと(以下略)


622 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:41
確かに、この程度の処理で巨大なテーブルを引くのはよくないな。
こうしよう。
int dec2hex(int x)
{
FILE *fp = popen("bc", "w");
fprintf(fp, "obase=16\n%d\n", x);
pclose(fp);
}



623 名前: デフォルトの名無しさん 投稿日: 02/04/17 20:44
int -> void



624 名前: デフォルトの名無しさん 投稿日: 02/04/17 21:06
>>622
これがCじゃなくてシェルスクリプトだったらUNIX的なすばらしい解決法だね。


625 名前: デフォルトの名無しさん 投稿日: 02/04/17 21:35
s[i++] = (t=n%16)>9 ? t-10+'A' : t+'0' ;
前後を組み立ててloop!!


626 名前: デフォルトの名無しさん 投稿日: 02/04/17 21:48
制御文字ってどんなのですか?


627 名前: デフォルトの名無しさん 投稿日: 02/04/17 21:48
>>625
コードがEBCDICでも大丈夫かな?あれはA-KとL-Zが分かれていただけ
でしたっけ。


628 名前: デフォルトの名無しさん 投稿日: 02/04/17 21:56
>>626
ほい。
http://www.google.com/search?hl=ja&q=ascii%83R%81%5B%83h&btnG=Google+%8C%9F%8D%F5&lr=lang_ja


629 名前: デフォルトの名無しさん 投稿日: 02/04/17 22:03
アスキーコードの奴だったんですかどもありがとうございます>>628



630 名前: デフォルトの名無しさん 投稿日: 02/04/17 22:43
なんかスレ違いかもしれませんが、
フリーウェアでおすすめのCコンパイラを教えてください
ちなみにwindowsMEでも動くやつをお願いします



631 名前: デフォルトの名無しさん 投稿日: 02/04/17 22:46
>>630
borland。C++だけど。それかgcc。C++だけど。


632 名前: デフォルトの名無しさん 投稿日: 02/04/17 22:49
>>630
とりあえずURLおば。
GCC:
http://www.gnu.org/software/gcc/gcc.html
BCC:
http://www.borland.co.jp/cppbuilder/freecompiler/
LSI-C試食版:
http://www.lsi-j.ab.psiweb.com/freesoft/


633 名前: デフォルトの名無しさん 投稿日: 02/04/17 22:52
漢なら。
http://www.openwatcom.org/


634 名前: デフォルトの名無しさん 投稿日: 02/04/17 22:58
>>631-633
レスありがとうございます。
グーグルで検索したときに出てきたLSI-cとかいうのはMEでも動くのでしょうか?
95と98としか書いていなかったので。


635 名前: デフォルトの名無しさん 投稿日: 02/04/17 22:59
>>634
うごくよ。でもLSI-C試食版はおすすめせん。制限が大きすぎるし、ANSIから
外れている点が多過ぎる。(wchar_tに対応してないなど)


636 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:11
>>635
丁寧に教えていただきありがとうございます。
LSI-cはおすすめではないのですか。う〜ん
ちなみに私は今C言語の猛特訓中でありまして、
コンパイラ使うのもポインタとか構造体とかのそこら辺の部分を実際に
動くところを確認したかっただけなんです。

もうちょっと色々調べてみます。
何かスレ汚してすみませんでした。


637 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:11
男は黙ってCygwin + GCC = (・∀・)イイ


638 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:17
>>636
だったらなおさらLSI-C試食版はやめた方がいいぞ。
構造体を正しく返せないなどのバグがあるから。


639 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:19
LSI-C試食版にはお世話になったが、今では論外。
GCCかBORLANDにしとけ。楽だし。


640 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:34
LSICのマニュアルは持ってて損はないけどな


641 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:42
>>633のは初めて知ったけどどうなの?
使ってるひといるのかな。


642 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:43
円の書き方教えて



643 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:44
ドラえもんに聞け


644 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:45
printf("円");


645 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:48
printf("\\");


646 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:51
gccやBorland-C++でも、正しく書いたCプログラムならコンパイルできるぞよ。


647 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:53
printf("○");



648 名前: デフォルトの名無しさん 投稿日: 02/04/17 23:54
>>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)にならないんでしょうか?


651 名前: デフォルトの名無しさん 投稿日: 02/04/18 00:01
>>649
>マイクソソフト
質問してるやつが2ちゃん言葉使ってるとむかつくから教えない。


652 名前: デフォルトの名無しさん 投稿日: 02/04/18 00:20
>>649
ファイルの拡張子を".C"にするとか言ってみるテスト。


653 名前: デフォルトの名無しさん 投稿日: 02/04/18 00:42
>>649
cl hoge.c
これ最強。


654 名前: デフォルトの名無しさん 投稿日: 02/04/18 05:00
う〜ん ポインタと配列で質問なんですが。

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

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

この差がわかりません。
ポインタの初期化ではメモリを確保したことにならないんでしょうか?


655 名前: デフォルトの名無しさん 投稿日: 02/04/18 05:11
http://www.st.rim.or.jp/~phinloda/cqa/cqa2.html#Q6


656 名前: デフォルトの名無しさん 投稿日: 02/04/18 06:57
>>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のコードがエラーにならない場合もあるらしい。


658 名前: デフォルトの名無しさん 投稿日: 02/04/18 08:15
>>657
constで宣言した変数と似た様な扱いなのね。


659 名前: デフォルトの名無しさん 投稿日: 02/04/18 08:31
>>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


660 名前: デフォルトの名無しさん 投稿日: 02/04/18 09:05
>>654
char b[]="hogehoge";

char b[]={'h','o','g','e','h','o','g','e','\0'};
と完全に同値な不規則な構文。このとき"hogehoge"は
文字列リテラルでは全くない。


661 名前: デフォルトの名無しさん 投稿日: 02/04/18 11:00
円のプログラム教えて



662 名前: デフォルトの名無しさん 投稿日: 02/04/18 11:01
>>661
お前、↑で書いてくれた奴に土下座して謝れ。



663 名前: デフォルトの名無しさん 投稿日: 02/04/18 11:10
関数の修飾子にpascalをつけるとどーなるんですか?


664 名前: デフォルトの名無しさん 投稿日: 02/04/18 11:33
>>663
8086の時代にはちょっとだけ効率がよくなった。
最近のヤツはしらん。



665 名前: MS-Cユーザ 投稿日: 02/04/18 11:48
>663
引数を左から順にスタックつんだはず。
可変長引数のprintfとかの動作は知らん。
>664
win16の時代には… では?


666 名前: デフォルトの名無しさん 投稿日: 02/04/18 12:06
>>665
> win16の時代には… では?

win16も俺にとっては最近。



667 名前: MS-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
...


668 名前: デフォルトの名無しさん 投稿日: 02/04/18 13:16
>>665
加えて、pascal呼び出しは、パラメータをスタックに積んだ場合、呼び出し先
で元に戻す。C呼び出しは、呼び出し元で元に戻す。
RISCなどのレジスタにパラメータを持って呼び出す場合はそんなに変わらない。


669 名前: デフォルトの名無しさん 投稿日: 02/04/18 13:22
pascal呼び出しは、スタックの調整のコードが呼び出し側から無くなるぶん、
コードサイズが小さくなるってこった。


670 名前: デフォルトの名無しさん 投稿日: 02/04/18 17:21
pascal の方がサイズは増える気が。


671 名前: デフォルトの名無しさん 投稿日: 02/04/18 17:51
Winmain()からDialogBox()を呼び出してリソースエディタで作ったダイアログボックスを表示
するのですが、表示座標を決めたいです。(左上に表示されてしまう)
どうにか方法はありませんか?


672 名前: 名無しさん@edlin 投稿日: 02/04/18 17:57
>>671
>>457の2つめのリンク


673 名前: デフォルトの名無しさん 投稿日: 02/04/18 18:00
char str[] = "あ"; //"あ"のシフトJISでのコードは 0x82a0
USHORT code = (str[0] << 8) + str[1]; //値は33184 = 0x81a0
なんで値が違っちゃうんですか??



674 名前: デフォルトの名無しさん 投稿日: 02/04/18 18:10
>>673
char が符号付きの環境の場合、str[1] == 0xa0 はマイナスの数として
扱われて、結果 USHORT( 0xffff8200 + (-0x60) ) == 0x81a0 に。
+0xa0 として使いたいなら unsigned char にするなり &0xff するなり。


675 名前: デフォルトの名無しさん 投稿日: 02/04/18 18:11
>>673
unsigned charにしる!


676 名前: 673 投稿日: 02/04/18 18:15
>>674-675
(UCHAR)tnx;


677 名前: デフォルトの名無しさん 投稿日: 02/04/18 18:18
>>676
WindowsだったらMAKEWORD()ってマクロがあるから
それ使ったほうがスマート。


678 名前: 676 投稿日: 02/04/18 18:23
(UCHAR)MAKEWORD();


679 名前: デフォルトの名無しさん 投稿日: 02/04/18 18:26
Timerの識別ってどうするんですか。


680 名前: デフォルトの名無しさん 投稿日: 02/04/18 18:30
>>679
WindowsならIDで識別。


681 名前: デフォルトの名無しさん 投稿日: 02/04/18 18:33
>>679
つーか全然Cと関係ないしAPIすれ逝けと小一時間(以下略)


682 名前: デフォルトの名無しさん 投稿日: 02/04/18 21:04
>>681
確かに、最近純API系の質問多いね。
今後は放置の方向で。どうしてもかわいそうなら誘導でよろ。


683 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:01
いろいろな言語を見てきてたどり着いた結論なんですけど、
Cはただのマクロに過ぎないという考えであってるでしょうか。
C++などに比べるとあまりにしょぼいですが、
こう割り切ってしまうとだいぶ開発が楽になります。


684 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:05
すみません、初心者なんですが、
double a = 0;
double b = 0.0;
これって違いがあるんですか?


685 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:08
>>683
どこが?


686 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:20
>>683
マクロを拡大解釈していけばあらゆる言語がマクロに見えるだろうね


687 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:20
>>683
ハァ?まるでJava房かのような発言だな

>>684
無いよ。


688 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:21
>>685
ちょっとしたプログラムを書くのには悪くないって感じです。
少し大きめの物を作るのには使いたくありませんけど。


689 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:24
>>686
非OOPLはすでにみんなマクロに見えてます。

>>687
JAVAはやりません。遅いから。


690 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:28
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すげぇー、とか逝ってるだけ。


694 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:46
>>689が言うJavaが遅いというのは、

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

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




695 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:46
言語を並べてガタガタぬかすのがそもそも(以下略)


696 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:46
ここはCしかわからない老人のスレですか?違いますよね。
Cを理解し、C++を理解していれば、Cの生産性がC++に比べてはるかに低いことは認識できると思いますけど?
もちろん、C++を使いこなせないプログラマの場合この限りではありませんが。


697 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:48
漏れの場合は、大部分のOOPLの方がマクロに見えるけどな、
というか、書いていて生成されるアセンブリコードが想像できない言語は全部。

つか、>>689が言うマクロって何だろう。


698 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:50
>>696
生産性の定義を述べてみ。
またCとC++の生産性をどうやって測定したのかも述べてみ。
それぞれ幅広い分野での実装例について比較可能な形で調べにゃならんわな。
まさか、定義も測定もなしに生産性がどうたら言うてるんじゃあるまいね?
まして、自分ひとりの経験でどうたら言うてるんじゃあるまいね?


699 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:51
>>694
1です。


700 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:55
>>696
だからと言ってC = マクロということにはなりません
ちゃんとC/C++理解してんの?あんた


701 名前: デフォルトの名無しさん 投稿日: 02/04/19 02:59
>>689が使ってる言語って何だ?
非OOPLがマクロに見える(ほめ言葉じゃないわな)って言うぐらいだから、
よっぽどOOPにこだわりがあるようだが、C++みたいなOOPLとしては
おもちゃ以下のものしか使ってないって事はないよな。

EiffelとかSmalltalkでもつかってんのか?


702 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:01
すげーカメラ目線だ


703 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:02
つーかここは C のスレであって C++ やら OOPL やらのスレじゃないんだが。


704 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:03
        ∧_∧
        ( ´Д` ) Σ スマソ >>702は誤爆・・・
       /,  /
      (ぃ9  |


705 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:15
>>697
一連の作業をあらかじめ一つにまとめて自動で実行するためのもの、
という意味で使用しています。
拡大解釈すれば、当然すべてのプログラムはマクロと取れます。

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

>>701
メインはC++です。
C++はOOPLとしては問題も多く含みますが、
そのC++ですら、非OOPLに比べたらだいぶましです。


706 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:18
C++はいいと思うが、Cをマクロといってるお前の頭の構造が(以下略


707 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:19
>>705
>重要なことは、C++はCのほぼスーパーセットとなっているので
>適切に判断すればどのような基準においてもCに劣ることはありません。

別の観点から言えばC/C++の何れかで書かれたコードは
どちらもC++のコードだと言ってるように見えるが気のせいか。


708 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:22
        ∧_∧
        ( ゚Д゚ ) <>>705いい加減にしろよ貴様
       /,  /
      (ぃ9  |


709 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:27
>>707
拡張子で(以下略

もちろんそうなるでしょう。
その場合はC++で書かれた一部のスタイルのプログラムはマクロのようだ、
ともいえるでしょう。
マクロのように見えるかどうかは言語そのもので決まるのではなくてプログラミングスタイルですから。
Cで書かれたプログラムでもマクロに見えないようなのはごまんとありますし、でもそういうプログラムをCで書きたいとは思いません。


710 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:32
>>709
いや、そうじゃなくて。
C++で書かれたコードしか存在しないって主張の中で
CよりC++だって言うのはトートロジーチックじゃあるまいか。
そりゃ詭弁じゃないか。
とこのように言っているのだよ。
大体C++で追加されたフィーチャーの生産性への寄与については
何も具体的な言及をしとらんじゃないか。
あ、クラスの効用とかなら言わんでいいよ。
理論的に優れている、というのはどんな言語にだって言えることなんだから。
あくまでも現実のソフト屋業界における生産性を聞いておるのだ。
実証もなしに見てきたようなことばっかり言ってたら脳味噌腐るぞ?


711 名前: マジレス 投稿日: 02/04/19 03:35
Smalltalk >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++ > C


712 名前: Lisper 投稿日: 02/04/19 03:37
マクロ >>>>>>>>>>>>>>>>>>>>>>>>>>>>> C > C++


713 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:39
・・・いつ Ruby が出てくるのかなと期待しているのは漏れだけではないはずだ(藁


714 名前: C厨 投稿日: 02/04/19 03:39
C > OOPL >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++


715 名前: Ruby!Ruby! 投稿日: 02/04/19 03:41
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>713 > >>683


716 名前: C/C++房 投稿日: 02/04/19 03:44
チンコ -> Rubyist


717 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:45
HSP>>>>>>>>>ラディソ>>>>>>Ruby>>>>>>>C++


718 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:47
>>716それはおかしい
Rubyist => チンコ
「Rubyistはチンコに評価される」


719 名前: 駄スレも育てるサーバは偉い 投稿日: 02/04/19 03:47
pc.2ch.net >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> このスレの住人


720 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:49
宗男 >>>>>>>>>>>>>>>>>>> このスレの住人 <<<<<<<<<<<<<<<<< 真紀子


721 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:51
1000!


722 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:53
俺 >>>>>>1>>>>>>>>>>lisp>>>>HSP>>>>>>>>>>>>>>>>>>715


723 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:54
電波=>>721


724 名前: デフォルトの名無しさん 投稿日: 02/04/19 03:55
>>710
実際に完成されたプロジェクトとしてその効果を客観的に判断するのはほぼ不可能でしょうね。
でもごく小さな範囲でなら可能です。
C++でSTLを使用すれば容易に線形リストを実装し検索・分類などの操作も可能です。
Cではその場合に応じて書かなければいけません。
たったこれだけのことですが、少なくとも他のすべてでC<=C++なので、C<C++は証明できます。


725 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:01
>証明できます
じゃぁ、証明してくれ。
少なくとも俺にはC<C++の`証明'をすることは不可能だ


726 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:02
Lisp >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>722 > 神 > >>1


727 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:05
>>745
724で証明されていますが、ご不満でも?


728 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:06
>>725
文系君にとって`証明'とはいくつかの事例を集めることなんでしょ。


729 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:06
>>724
>C++でSTLを使用すれば容易に線形リストを実装し検索・分類などの操作も可能です。
>Cではその場合に応じて書かなければいけません。

こういうのを、

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

と言って釘をさして、

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

こう聞いたんだが、言葉の順序を変えれば詭弁も通ると思っておるんかいな?
言語の話をしているのにSTLを持ち出すのもおかしな話だと思うがね。
標準ライブラリも含めてC++だと言い張るんなら結構なことだが。


730 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:12
>>724
>実際に完成されたプロジェクトとしてその効果を客観的に判断するのはほぼ不可能でしょうね。
>でもごく小さな範囲でなら可能です。

これも凄いこと言っとるよなぁ。
個人的な経験で語るなとも言ったのに読めておらんのかいな。
これじゃ、「世間じゃ知りませんがボクの知ってる範囲内じゃC++は凄いんです!」と言っとるようなもんだ。


731 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:13
CよりC++のほうが、一人で1ヶ月くらいで書けるプログラムの生産性が高いのは、俺の実感。
ところが、人数の多いプロジェクトで、人海戦術に近くなると、Cの方が生産性高くなるんだ。
Cの方が理解してなくちゃいけないことが少ないからだろうな。


732 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:15
生産性なんて個別的なもんだからね。
仕様、納期、人員、環境、どれが変わっても左右される。
生産性ってキーワードで物事を一括りにするのは駄目コンサルだけにして欲しいよ。


733 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:19
通は道具を愛でるがプロは道具を選ぶ。そういうこった。


734 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:20
>>727の脳味噌はピンポン球くらいの大きさであることを証明しました。


735 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:20
>>728
帰納法をご存じない?

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

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

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

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


736 名前: 731 投稿日: 02/04/19 04:20
>>732
え? おれ?


737 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:21
>>733
現実は選びたくても選べない。


738 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:24
OOが悪いとは言わん、またC++のほうが当然Cより便利だろう。
だが、Cはマクロ、といってる根拠がわからん。
単にCを貶めたいだけか?


739 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:25
>>735
人の発言はよく読んだ方がいいと思うなぁ。
もし私が「C > C++」と言いたがっていると思うんなら根拠を出して欲しいね。
で、結局、実世界に即した客観的評価は自分には持ち出せないので
理論的なトピックを通じてC++はCより優れていると評価するってことでいいんかね?

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

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


740 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:25
彼は屁理屈こき麻呂。


741 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:27
>>736
違う違う(藁
漏れアンタに同意してるの(藁


742 名前: 728 投稿日: 02/04/19 04:29
>>735
> 帰納法をご存じない?
知ってますよ。というか
> いくつかの事例を集めること
は正当な`証明'であると言いたいわけですか?
もしかして文系君のいう帰納法と数学的帰納法の違いをご存じない?


743 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:31
>>739

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

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

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

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

STLはどうなりましたか?


744 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:31
>>742
十分に数学的帰納法になっていますが?


745 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:34
>>744
>>724がか?
本気で言ってるのか?
だとしたらアフォ丸出しですよ?


746 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:35
>>743
「同じように使用できる」を記法として同等にの意と言いたい訳かい?
だったら、C++の記法が優れていることを示してもらいたいねぇ。
それとも、C++はCのスーパーセットだからと言うのなら
そういう言い方自体が詭弁ではないのかというところに答えて欲しいねぇ。

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

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

枝葉末節を斬り返していけばどうにかなると思っとらんか?


747 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:37
>>746
> 理論的なトピックを通じてC++はCより優れていると評価するってことでいいんかね?

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


748 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:40
>>747
>私には、おそらく私以外のすべての人にも、あなたの言う「実世界に即した客観的な評価」は出せませんから。

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

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

これは侮辱と言うんじゃないかね、と、これが私の一番言いたいところだ。
これが自分の主観であることに異はないと思うが、
なぜそんなものを根拠にして見ず知らずの住人を老人呼ばわりするのか、
説明して欲しいねぇ。


749 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:45
生産性か。。。。
言語知らない新入社員に「Cで組め」「C++で組め」って言った時は
Cの方が覚えるの簡単なんで生産性たかいとおもうが。。。


750 名前: 736 投稿日: 02/04/19 04:45
>>741
あ、そか、ども。
なんつか、2ちゃんって、素直に読めないクセがついちゃうからさ(^^;


751 名前: デフォルトの名無しさん 投稿日: 02/04/19 04:59
>>748
私の持つ根拠とあなたの欲している根拠が異なる点に基づいているだけですが?
私にとっての(あなた風に言えば理論的な?)根拠はあなたにとって根拠とは呼べないのでしょうし、
あなたにとっての(実践的な?)根拠は私にとっては根拠とは呼べない。
それだけのことです。

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

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

C++を理解したうえで、CがC++よりも生産性が低くないと主張するならば、そう根拠を持って主張すれば言いだけのことです。
私はそれらの人に対してなんら侮辱するつもりはありません。


752 名前: デフォルトの名無しさん 投稿日: 02/04/19 05:05
>そもそも先に侮辱しているのはあちらです。
始めにおまえがCをマクロなどと言わなければこんなレスはつかない。


753 名前: デフォルトの名無しさん 投稿日: 02/04/19 05:06
ヘッダーファイルに関数を書くのは基本的にはやらないほうが
いいんですよね?


754 名前: デフォルトの名無しさん 投稿日: 02/04/19 05:06
>>751
>私の持つ根拠とあなたの欲している根拠が異なる点に基づいているだけですが?
>私にとっての(あなた風に言えば理論的な?)根拠はあなたにとって根拠とは呼べないのでしょうし、
>あなたにとっての(実践的な?)根拠は私にとっては根拠とは呼べない。

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

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

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

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

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

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

CはC++に常に劣るわけではない、という証明がここでは重要だと言うのかね?
だとしたらそれは、君の思い上がりだ。
誰もそんな話をここでしたいとは思っておらんよ。
ここはCの話をするスレだ。違うかね?


755 名前: デフォルトの名無しさん 投稿日: 02/04/19 05:08
知らないやつをバカにするのは好きじゃないけど、
知らないことを自覚してないやつは、おおいに侮辱するべき。


756 名前: デフォルトの名無しさん 投稿日: 02/04/19 05:09
753が微妙にカワ(・∀・)イイ!


757 名前: デフォルトの名無しさん 投稿日: 02/04/19 05:10
>>753
ヘッダーはインターフェースと実装の分離のために使うのが基本だからね。
ヘッダーに実装を書いてしまうと実装の変更の度に不要であるはずのコンパイルが発生してしまう。


758 名前: デフォルトの名無しさん 投稿日: 02/04/19 05:13
>>751
>>691-693なんて相手にすんな。
お前もアホだが>>691-693はお前とは比べ物にならないくらいアホだ。


759 名前: デフォルトの名無しさん 投稿日: 02/04/19 05:16
うぃ〜す。アホはぼちぼち寝ますわ(藁


760 名前: デフォルトの名無しさん 投稿日: 02/04/19 05:48
ん?またC叩き祭りがはじまったの?


761 名前: 753 投稿日: 02/04/19 05:59
Linuxのソースコードにはide.hなんかに関数が書いてあったりして
ちょっとCプログラミングの(自分の考えていた)常識を覆されました。

もっと勉強します。


762 名前: デフォルトの名無しさん 投稿日: 02/04/19 06:08
>>761
書いてありません。


763 名前: 753 投稿日: 02/04/19 06:16
>>762
2.5系のには入ってるんですよ。
いづれ取り除かれるのかもしれないですが。


764 名前: デフォルトの名無しさん 投稿日: 02/04/19 06:45
お前の意見だとノイマンコンピュータはマクロだな。と遅レス。



765 名前: デフォルトの名無しさん 投稿日: 02/04/19 07:13
>>763
ソースの記述に拘るなら*BSDをどうぞ。
Linuxはそういうもんだと思って付き合うのがよろし。


766 名前: デフォルトの名無しさん 投稿日: 02/04/19 07:19
>>765
どこで落とせるんですか?
ファイルに直リンクでお願いします。


767 名前: デフォルトの名無しさん 投稿日: 02/04/19 07:29
ハァ??


768 名前: デフォルトの名無しさん 投稿日: 02/04/19 07:32
ハァ???


769 名前: デフォルトの名無しさん 投稿日: 02/04/19 07:32
>>767
bz2とかになってると勘違いしてる人っぽいですな。



770 名前: デフォルトの名無しさん 投稿日: 02/04/19 07:34
>>769
bz2とかになっていないと勘違いしてる人っぽいですな。


771 名前: デフォルトの名無しさん 投稿日: 02/04/19 07:37
C++のクラスやらテンプレートやらの記法は結局のところCに変換されるマクロですとか逝ってみるテスト


772 名前: デフォルトの名無しさん 投稿日: 02/04/19 07:37
>>771
いつの時代の話をしているの?


773 名前: デフォルトの名無しさん 投稿日: 02/04/19 07:38
>>771
しつこい


774 名前: デフォルトの名無しさん 投稿日: 02/04/19 07:45
たまにカーネルMLにもC++房が出現するよなw


775 名前: デフォルトの名無しさん 投稿日: 02/04/19 09:45
>>683-771
みんな元気だねえ


776 名前: デフォルトの名無しさん 投稿日: 02/04/19 09:47
元気ですかー!

元気があればなんでもできる、、


777 名前: デフォルトの名無しさん 投稿日: 02/04/19 10:23
>>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++はそれで優れた点もある。しかし両者とも欠点はある。
いつも言われることだが銀の矢は存在しない。優れたプログラマはどちらでもそつなく
仕事をこなすがヘボはどっちでもヘボ。


779 名前: デフォルトの名無しさん 投稿日: 02/04/19 11:51
たまに、っつーかよくいるんだよね。
XはYより優れているということをYしかしらない君たち原始人に教えてやろうって態度の奴。
インドに「近代的教育」を施したイギリス人の再来かと見紛える(ワラ
しかもまた習いたての若いのに多いのが頭の痛い話で・・・。


780 名前: デフォルトの名無しさん 投稿日: 02/04/19 12:58
整数から文字列に変換する関数ないですか?


781 名前: デフォルトの名無しさん 投稿日: 02/04/19 13:01
>>780
printf じゃ駄目?


782 名前: デフォルトの名無しさん 投稿日: 02/04/19 13:01
>>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);
}

直してくれちょ


789 名前: デフォルトの名無しさん 投稿日: 02/04/19 14:00
/*int num=1;*/と
/*char h[4];*/と >>786 以上


790 名前: デフォルトの名無しさん 投稿日: 02/04/19 14:05
788
何をどう直せと。

void main(void) => int main(void)
で最後にreturn 0;というわけでもあるまい。


791 名前: デフォルトの名無しさん 投稿日: 02/04/19 14:36
>fputs(">>",fp);
>sprintf(h,"%d",i);
>fputs(h,fp);

fprintf(fp, ">>%d", i)


792 名前: デフォルトの名無しさん 投稿日: 02/04/19 14:45
>>791
それは、あとできずいて直しますた


793 名前: デフォルトの名無しさん 投稿日: 02/04/19 14:47
>>788
余裕があったらエラーチェックも入れてください。


794 名前: デフォルトの名無しさん 投稿日: 02/04/19 14:49
>>788
> for(i=0;i<=input;i++){
仕様が良くわからないのだが
input = 10の場合、11回繰り返したいのか?



795 名前: デフォルトの名無しさん 投稿日: 02/04/19 14:55
>>794
実は、もう終了しました。
スマソ


796 名前: デフォルトの名無しさん 投稿日: 02/04/19 14:57
>>795
自分で十分考えてから質問すれ。


797 名前: デフォルトの名無しさん 投稿日: 02/04/19 15:49

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

例えば、

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

とあった時に 7 の所を 変数 ketaで指定し、
結果の表示が 5 桁になるように、とか。



798 名前: デフォルトの名無しさん 投稿日: 02/04/19 15:52
できます。


799 名前: デフォルトの名無しさん 投稿日: 02/04/19 16:08
798じゃないけどヒント。

char* s = "%.7F";
printf(s, num);


800 名前: デフォルトの名無しさん 投稿日: 02/04/19 16:12
おいおい、こうだろ?(w

printf("%.*f", keta, num);


801 名前: デフォルトの名無しさん 投稿日: 02/04/19 16:24
おおー、そうなんか。すまん。俺も知らんかった(藁
いや、勉強になった。さんくすこ。


802 名前: デフォルトの名無しさん 投稿日: 02/04/19 16:42
>>799
fは小文字じゃなくてもいいの?


803 名前: 797 投稿日: 02/04/19 16:53

出来ました。(^-^

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

サンクス。


804 名前: デフォルトの名無しさん 投稿日: 02/04/19 20:24
Cマンセage


805 名前: クレジャパン 投稿日: 02/04/19 20:45
つまらない事をお聞きしますがC言語ってなんですか?


806 名前: デフォルトの名無しさん 投稿日: 02/04/19 20:55

グーグルの予感・・・。


807 名前: デフォルトの名無しさん 投稿日: 02/04/19 20:56
荒れる予感。


808 名前: デフォルトの名無しさん 投稿日: 02/04/19 21:12
>>805
UNIX開発専用言語。


809 名前: デフォルトの名無しさん 投稿日: 02/04/19 21:45
>>805
高級マクロアセンブラ。


810 名前: デフォルトの名無しさん 投稿日: 02/04/19 21:46
>>805
>>805>>808には使うことのできない言語。
7行スレ荒らしたのはおまえか?


811 名前: デフォルトの名無しさん 投稿日: 02/04/19 23:14
標準関数のソースって手に入れられますか?


812 名前: 名無しかも 投稿日: 02/04/19 23:31
関数の外に変数の宣言をおくと、どこの関数からも参照できる変数になり便利ですが、なるべく使わないほうがいいのはどうしてですか?


813 名前: デフォルトの名無しさん 投稿日: 02/04/19 23:33
>>812
混乱するから。


814 名前: デフォルトの名無しさん 投稿日: 02/04/19 23:34
手に入るよ
俺が書いたやつなら/cygdrive/d/prog/library/standard_library/
にstring.hとctype.hがあるから持ってげ


815 名前: デフォルトの名無しさん 投稿日: 02/04/19 23:34
親の通帳とハンコをリビングに置いておくと、家族誰でもお金を引き出せることができ便利ですが、なるべく隠しておくほうがいいのはどうしてですか?


816 名前: デフォルトの名無しさん 投稿日: 02/04/19 23:35
メモリーの無駄使いになるから


817 名前: デフォルトの名無しさん 投稿日: 02/04/19 23:38
>815
貧乏になるから


818 名前: デフォルトの名無しさん 投稿日: 02/04/19 23:57
>>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は全然違う」とか言われたんですけど、
どこが違うのか全然わからないのです。
どなたか教えていただけないでしょうか・・・。


823 名前: デフォルトの名無しさん 投稿日: 02/04/20 00:44
        ∧_∧
        ( ´Д` ) 書いてください。(しかも考えうる最高の実行速度で)
       /,  /
      (ぃ9  |


824 名前: デフォルトの名無しさん 投稿日: 02/04/20 00:46
>>820
上位n個を取り出すなら「ヒープソートを途中まで」というのが
とりあえず基本かと。もっと高速な方法もたぶんあるだろうけど。

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

>>822
Cという言語自体は基本的に全然変わらん。
OSとかシステムに依存するライブラリの部分は色々と違うだろう。


825 名前: デフォルトの名無しさん 投稿日: 02/04/20 00:59
(;´-`).。oO(>>820 こいつはヲレに対して挑戦してきてるのか・・・?)
(;;´-`).。oO(どう答えてやるか・・・・・)
(;;;´-`;;).。oO(クイックソートかよ・・・不慣れなやつじゃん・・・)
(;゚-゚).。oO(.......)

(;つДT) < >>820は逝ってよし!


826 名前: デフォルトの名無しさん 投稿日: 02/04/20 01:03
>>820
結果は base[0] から base[size*top-1] までに上書きしていいのか?


827 名前: デフォルトの名無しさん 投稿日: 02/04/20 01:03
>>820
CやめてC++のpartial_sortでも使え!プログラムせんでええぞ。


828 名前: デフォルトの名無しさん 投稿日: 02/04/20 01:04
>>827
それはいけましぇん。意味が違う。


829 名前: デフォルトの名無しさん 投稿日: 02/04/20 01:06
>>820
それ、宿題の問題文を敬語で書き直しただけちゃうんか


830 名前: デフォルトの名無しさん 投稿日: 02/04/20 01:20
>>822
機械系(組み込み系)とUNIXのCの違いは、824が書いた通り、言語としては同じ。
組み込みだと、標準ライブラリが有っても使えない事も多い。
メモリ消費量や、実行速度、あるいは割り込みの関係上ね。

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


831 名前: デフォルトの名無しさん 投稿日: 02/04/20 04:24
>830 初めての男になれるわけですねハァハァ


832 名前: デフォルトの名無しさん 投稿日: 02/04/20 04:53
>>820
その課題、結構面白いね。
>>824
確かに、それがよさそうだね。

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

最後に取り出す時は、ヒープに使ってた配列をクイックソートってのが
効率いいのかな?


833 名前: デフォルトの名無しさん 投稿日: 02/04/20 07:59
>>820
quicksortはO(logN*N)に比例するけど
Top10なら10個の要素のみ記憶して,バイナリサーチで探して挿入するのが
いいんじゃないかのん。計算量がlog2_10*Nに収まるからこっちのほうが
速いのではないかと思われ。


834 名前: デフォルトの名無しさん 投稿日: 02/04/20 11:17

>>811
検索ぐらいは、かけような。
ftp://ftp.gnu.org/gnu/glibc


835 名前: 名無しかも 投稿日: 02/04/20 11:35
fopenは必ず fclose しないといけないんですか?
fp == NULL の場合も fclose しないといけないんですか?


836 名前: デフォルトの名無しさん 投稿日: 02/04/20 11:37
オープンに失敗したら閉じなくてもいいだろ。


837 名前: デフォルトの名無しさん 投稿日: 02/04/20 11:37
NULLの場合はfcloseしてはいけません


838 名前: 835 投稿日: 02/04/20 12:14
>>837

何でですか??


839 名前: 837じゃないけど 投稿日: 02/04/20 12:28
>>838
例えば、FreeBSDの man fclose によると、
fclose() does not handle NULL arguments; they will result in a segmentation violation.
だそうです。


840 名前: 835じゃないけど 投稿日: 02/04/20 12:33
実行時の効率を最優先するCのライブラリはそういったNULLの
確認を基本的にはやってくれないんですよね?


841 名前: デフォルトの名無しさん 投稿日: 02/04/20 12:41
Cはコードに書いていないことは基本的に何もやってくれません。
すべてプログラマの責任です。


842 名前: 841 投稿日: 02/04/20 12:42
/* 2行目なんか変だけどまあいいや */


843 名前: 837じゃないけど 投稿日: 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チェックしてくれるみたい。


844 名前: デフォルトの名無しさん 投稿日: 02/04/20 12:55
double freeと似た様な状態になるのね。



845 名前: デフォルトの名無しさん 投稿日: 02/04/20 13:03
自作ヘッダファイルの使い方が良くわかりません。
関数宣言をぶち込めば良いんですか?


846 名前: デフォルトの名無しさん 投稿日: 02/04/20 13:05
>>845
本読んだり、人のソース読んだりしてみてください。


847 名前: デフォルトの名無しさん 投稿日: 02/04/20 13:13
オブジェクトファイルに含まれない全ての情報をぶち込んでください


848 名前: デフォルトの名無しさん 投稿日: 02/04/20 13:25
>>845
おれは、他のファイル(*.c,*.h)から参照される可能性がある
・プロトタイプ宣言
・定数定義
・構造体定義
などをぶちこむようにしてる。


849 名前: デフォルトの名無しさん 投稿日: 02/04/20 13:33
>>845
関数と変数宣言以外は皆書けってことだな。


850 名前: デフォルトの名無しさん 投稿日: 02/04/20 14:02
extern "C"


851 名前: デフォルトの名無しさん 投稿日: 02/04/20 15:30
http://www.dodgson.org/lab/hat/polc.html
ここに出てるコード↓、

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

クールだと書いてありますが、どういうときに使えるんでしょうか。
ループ前に a == b なら止まらず、そうでなければa,bのインクリメント
一回以外に何も起きないようにおもうのですが。。。。。



852 名前: デフォルトの名無しさん 投稿日: 02/04/20 15:44
>>851
文字列をコピーするのに使える。
もしくは終端がNULLで終わっているものなら何でも。


853 名前: デフォルトの名無しさん 投稿日: 02/04/20 15:45
>>851
while (a++ = b++); の間違いじゃないか?


854 名前: デフォルトの名無しさん 投稿日: 02/04/20 15:45
>>852
でも while の中身空っぽだよ?


855 名前: デフォルトの名無しさん 投稿日: 02/04/20 15:49
>>851

a と bが同じ型だったら、無限ループになるような。。。


856 名前: デフォルトの名無しさん 投稿日: 02/04/20 15:51
どっかで止まるんじゃない?
文字列だったら '\0' を通りすぎた後とか。


857 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:00
while (a++ = b++); だと non-lvalue in assignment で
コンパイルできねっす(gcc)。



858 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:01
while(*a++ = *b++);
の間違いでは?


859 名前: 851 投稿日: 02/04/20 16:04
>>858
なるほど、ようやく意味がわかりました。
元URLはコレの間違いなんですかねえ。



860 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:15
>>858
それの間違い以外にちょっと考えられないけど、
アスタリスクの抜けに、代入と比較の取り違えの
2個所も間違ってると、なにかあるんじゃないかとかんぐってしまう…


861 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:23
良くわからんが、
「非0→真」「0→偽」
というのを暗黙的に使うなと言う説明のために
適当に書いた、特に意味の無いコードなのかもしれん。


862 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:24

>>858 こういうのは?

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

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

return *s - *t;
}


863 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:26
元記事はC++らしいね。
省略なしで書くと↓ってなってる。
while(true == (a++ == b++)){ /* do nothing */ }


864 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:27
>>862
sとtの中身が同じだとまずいような…


865 名前: 820 投稿日: 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ってかいてあるしなぁ。。



867 名前: 820 投稿日: 02/04/20 16:34
ezmallocは、確実にメモリを確保できると仮定したmalloc


868 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:38
>>864

言われてみればそういう気もするが、
なぜかうちの gcc(2.91) では s と t が同じでも動く。
何故だ。


869 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:42
>>868
同じ時の戻り値は?
変数の外側のメモリにまでどんどんアクセスしてってそのうち一致しただけじゃないの?


870 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:43
>>868
segvらないでどうにか動くのは まぁ ともかく、それで結果(戻りのint)も正しいのかい?



871 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:43
>>868
書き込みしてないから一応動くんじゃない?

↓ここを変更すると正しく動くと思うけど。
return *(s-1) - *(t-1);


872 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:44
ime.nu 経由じゃこのスレ見ないだろうから、だれか本人にメールできいてみてくれw
関連記事はなかなか素晴らしいし、きっとデキる人なんだろうと思う。



873 名前: 868 投稿日: 02/04/20 16:45
下二行は間違い。


874 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:45
>>871
> 書き込みしてないから一応動くんじゃない?
んなーこたないだろ



875 名前: 869 投稿日: 02/04/20 16:45
>>873は868じゃなくて869ね。


876 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:49
中身が同じだと最低確保した1バイト先までアクセスする部分に目をつぶったとしても、
中身が同じでも0が返らないから使い物にならない。


877 名前: 868 投稿日: 02/04/20 16:51
>>869 >>870

戻り値はちゃんと 0 になる。
何で動いてるのかわからん、暴走するはずだよな。
つうーかお前らもコンパイルして下さいよ。(W


878 名前: デフォルトの名無しさん 投稿日: 02/04/20 16:53
/*
中身が違う場合だけ使って下さい
中身が同じ場合の結果は不定です。
*/
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)))
これでよし。安全。



880 名前: デフォルトの名無しさん 投稿日: 02/04/20 17:05

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



882 名前: デフォルトの名無しさん 投稿日: 02/04/20 17:10
>>880
ちなみにそれは間違ってるよ(w


883 名前: 868 = 880 投稿日: 02/04/20 17:11

何か本題とエラくはずれてしまった。


884 名前: 845 投稿日: 02/04/20 17:11
>>846-849
わかりました。ありがとうございます。


885 名前: デフォルトの名無しさん 投稿日: 02/04/20 17:13
>>882
あら、直しといて。(W


886 名前: デフォルトの名無しさん 投稿日: 02/04/20 17:17
>>885
*s++ == *t++がfalseでwhile抜けた時は、return *(s-1) - *(t-1);


887 名前: デフォルトの名無しさん 投稿日: 02/04/20 17:20
intをcharに変換する標準関数ってありますか?
(atoiの逆)


888 名前: デフォルトの名無しさん 投稿日: 02/04/20 17:20
itoa,sprintf


889 名前: デフォルトの名無しさん 投稿日: 02/04/20 17:20
itoaは標準じゃないかも。


890 名前: デフォルトの名無しさん 投稿日: 02/04/20 17:22
>>887
snprintf



891 名前: デフォルトの名無しさん 投稿日: 02/04/20 17:24
snprintfは新しいコンパイラにしか入ってないかも。


892 名前: デフォルトの名無しさん 投稿日: 02/04/20 17:26
sprintfは危険かも。DQNかも。




893 名前: 887 投稿日: 02/04/20 17:36
みなさんお答えありがとうございます。
早速試してみようと思います。


894 名前: デフォルトの名無しさん 投稿日: 02/04/20 18:28
a portable implementation of snprintf
http://www.ijs.si/software/snprintf/


895 名前: デフォルトの名無しさん 投稿日: 02/04/20 21:32
CString::Format


896 名前: デフォルトの名無しさん 投稿日: 02/04/20 21:49
CStringは標準じゃないかも。


897 名前: デフォルトの名無しさん 投稿日: 02/04/20 22:07
std::stringstream::operator<<(int) と
std::stringstream::str()




898 名前: デフォルトの名無しさん 投稿日: 02/04/20 22:12
まああれだな、
%d とかの書式で出力すること自体時代遅れだしな。



899 名前: デフォルトの名無しさん 投稿日: 02/04/20 22:18
>>895,>>897
ここCスレなんですが。


900 名前: デフォルトの名無しさん 投稿日: 02/04/20 23:38
        ∧_∧
       ( ´Д`) <はぁー・・・
      /    \      
   _  | |    | |_..∬
  |\ ̄ ̄ ̄ ̄ ̄ ̄ 旦.\
 ./..\\            \
/   \|=================|
\    ノ     900       \


901 名前: デフォルトの名無しさん 投稿日: 02/04/21 02:38
>>887
char a;
int n;
a = (char)n;


902 名前: デフォルトの名無しさん 投稿日: 02/04/21 02:38
ちょうどいい話題なんで便乗質問。
intの値を引数として渡すと、文字列に変換して返す関数ってC(もしくはC++)にはないのかな?
結構調べてもみつからなかったんで。
ないとしても、どうしてないのかな?



903 名前: デフォルトの名無しさん 投稿日: 02/04/21 02:44
しいてあげるなら
_itoa()
だがこいつはANSIじゃないからな。
つーわけでない。自分で作るよろし。


904 名前: デフォルトの名無しさん 投稿日: 02/04/21 02:47
俺が作った符号無し整数をb進文字列にするitobならあるが


905 名前: デフォルトの名無しさん 投稿日: 02/04/21 02:49
>>902
1. sprintfが有るから。
2. 標準になくても、多くの処理系に入ってるから。
3. このくらい誰でも作れるから。


906 名前: 902 投稿日: 02/04/21 02:57
>>903
レスありがとう。
マニュアル見ました。
javaでいう String.valueOf(int) みたいな簡単なのってないのね。
でもなんで標準でないんだろう??
そっちのほうが気になる。


907 名前: 902 投稿日: 02/04/21 02:59
>>905
あわわ、ありがとう。



908 名前: デフォルトの名無しさん 投稿日: 02/04/21 03:00
必要なものは自分で作る
これCの常識


909 名前: 905 投稿日: 02/04/21 03:09
>>902
4. C++だったら演算子のオーバーロードが有るから。cout << 774 とか。


910 名前: 902 投稿日: 02/04/21 03:13
あー、なんとなくわかってきた。

たとえば char* IntToStr(int i)という関数をつくったとして、
その中でとったchar*の領域は誰が開放するの?
って理由からなのかな?ぜんぜん違う?



911 名前: 905 投稿日: 02/04/21 03:44
>>910
そういう関数の主な実装で例を挙げると、
printf("%s,%s\n",intToStr(1),intToStr(2));
の結果が保証されない。
vc++のitoaで同じ事やると、1,1が表示されます。

これを回避する為に毎回mallocすると、楽しい事になります。


912 名前: デフォルトの名無しさん 投稿日: 02/04/21 03:49
素直に
void IntToStr(int i,char *p, int max_len)
みたいな形で作るのがよいかと。


913 名前: デフォルトの名無しさん 投稿日: 02/04/21 03:51
>>912
それじゃあsprintf使えばいいじゃん。


914 名前: 902 投稿日: 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を使っても良い。スレ違いになるけどな。



916 名前: デフォルトの名無しさん 投稿日: 02/04/21 04:44
>>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ならそれら全てをこなしてくれるのに。


918 名前: デフォルトの名無しさん 投稿日: 02/04/21 10:46
>>917
テンプレートの偉大さを痛感するとき・・・ってテンプレートじゃ対応しきれないなw。


919 名前: デフォルトの名無しさん 投稿日: 02/04/21 11:12
>>918
できますよ。一例をだすなら boost::lexical_cast<T>(num);



920 名前: デフォルトの名無しさん 投稿日: 02/04/21 11:54
数値->文字列なんて、まともな設計をしとけば
UIでデータを出力する部分にしか使わないでしょ。
(ほとんどの場合ね)

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

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

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

要求される速度、安全性に応じて、いろんなバージョンが考えられるから
やっぱすきなの作れ。



921 名前: デフォルトの名無しさん 投稿日: 02/04/21 12:12
>>916
sprintf使うならはじめっからそこで書式指定しろよ...



922 名前: デフォルトの名無しさん 投稿日: 02/04/21 12:51
>>921
おまえはツッコミの天才だな


923 名前: デフォルトの名無しさん 投稿日: 02/04/21 14:37
俺も基本的には sprintf だな。
1文字とか2文字に限定される場合は、'0'を
足したりするかも。
  x &= 0xf;
  ( x > 9 ) ? x + 'a' - 10 : x + '0'


924 名前: デフォルトの名無しさん 投稿日: 02/04/21 15:34
新スレきぼーん。
俺が立ててもよいが、名前が思い浮かばん。
ただ"日下部陽一"とかくだけではだめなんだよな?


925 名前: デフォルトの名無しさん 投稿日: 02/04/21 15:37
金融プログラマー日下部陽一
うーん、ちと長い?


926 名前: デフォルトの名無しさん 投稿日: 02/04/21 15:51
>>925
それで立ててくる。


927 名前: デフォルトの名無しさん 投稿日: 02/04/21 15:56
http://pc.2ch.net/test/read.cgi/tech/1019372139/

新スレ立てました。


928 名前: デフォルトの名無しさん 投稿日: 02/04/21 17:13
intに、カンマをつけた文字列に直す関数、てのが結構欲しいんだが
そういうのってない?
9654403

9,654,403
に変換するやつ。sprintf()では無理だし。


929 名前: デフォルトの名無しさん 投稿日: 02/04/21 17:16
自分で書くよろし。


930 名前: デフォルトの名無しさん 投稿日: 02/04/21 17:19
>>928
sprintfで文字列に直してからカンマを挿入すればすごく簡単じゃない?


931 名前: 851 のリンク先を書いた本人 投稿日: 02/04/21 20:04
>>851
858 の指摘が正しいです。ごめんなさい



932 名前: デフォルトの名無しさん 投稿日: 02/04/23 19:34
sprintfがバグります。
同じソースをUNIXのgccでコンパイル→UNIXで実行すると動くのに、
Borland C++でコンパイル→WIN98で実行すると
その後の入力が全部壊れてしまいます。
これってプログラムが間違ってるってことでしょうか?


933 名前: デフォルトの名無しさん 投稿日: 02/04/23 19:39
>>932
具体的なコード見せれ


934 名前: デフォルトの名無しさん 投稿日: 02/04/23 20:59
>>932
>これってプログラムが間違ってるってことでしょうか?

そうです(断言)。


935 名前: デフォルトの名無しさん 投稿日: 02/04/23 22:17
>>932
マルチは氏(略


936 名前: デフォルトの名無しさん 投稿日: 02/04/23 23:07
fwrite関数で,構造体を保存して,fread関数で読みこもうとしたんですが,

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

とでます。

保存したファイル名は,name.datなんですが。


937 名前: デフォルトの名無しさん 投稿日: 02/04/23 23:11
>>936
すごいことになってるなぁ。
とりあえず解決できそうにないけど、OSとコンパイラ何?


938 名前: デフォルトの名無しさん 投稿日: 02/04/23 23:12
OSはWindows98で、
コンパイラは,VC++6.0です。
ファイル軽いから,UPしたほうが早いですかね?


939 名前: 937 投稿日: 02/04/23 23:16
>>938
そのエラー、ビルド時に出るんじゃなくて、実行時にでるの?
なぜだーーー
まぁ、短いならUPしてちょ。


940 名前: デフォルトの名無しさん 投稿日: 02/04/23 23:26
つか、デバッガのステップ実行でおこってるような‥‥


941 名前: デフォルトの名無しさん 投稿日: 02/04/23 23:30
拡張子zipに変更してください
ttp://sylphys.ddo.jp/imgboard/img-box/img20020423232833.jpg
あと、1が書きこみ関数用で,2が読みこみ関数用です。


942 名前: デフォルトの名無しさん 投稿日: 02/04/23 23:45
あのー


943 名前: デフォルトの名無しさん 投稿日: 02/04/23 23:54
やっぱりスレの1は日下部先生じゃないとビシッとしないな。
次スレの1でD.リッチーとかやるなよ。スレがダレルからな。


944 名前: 937 投稿日: 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


945 名前: 938 投稿日: 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でなくて?



947 名前: 937 投稿日: 02/04/24 00:34
>>946
一応、そこは特例で大丈夫。個人的には気持ち悪いけどね。
printf("Kou = %p\n",Kou);
printf("&Kou = %p\n",&Kou);



948 名前: 937 投稿日: 02/04/24 00:36
>>945
その3行が何をしているのかと、結果がどうなったのかを吟味する。


949 名前: デフォルトの名無しさん 投稿日: 02/04/24 02:53
C言語における、「再利用性」とは何かのべれ


950 名前: デフォルトの名無しさん 投稿日: 02/04/24 03:12
>>949
コピーペーストをすることで、ある機能を簡単に別の処理で
再利用できる。

…でも、そんなことしちゃだめ。


951 名前: デフォルトの名無しさん 投稿日: 02/04/24 05:47
>>949
Cなら機能(関数)をライブラリとして再利用できる。ってとこか。
今じゃ普通の機能だが、当時は画期的だった。


952 名前: 938 投稿日: 02/04/24 16:55
>>937
朝起きてから,よーく考えて,苦手なCreateFile関数,WriteFile関数を勉強して,
なんとかちゃんといくようになりました。


953 名前: デフォルトの名無しさん 投稿日: 02/04/24 16:58
宿題手伝ってるっぽいな


954 名前: 938 投稿日: 02/04/24 19:50
CreateFile関数とWriteFile関数を使って,バイナリデータとしてじゃなく、
ファイルに直接書きこむ事はできるのでしょうか?


955 名前: デフォルトの名無しさん 投稿日: 02/04/24 19:54
>>954
はぁ?
ファイルの概念に対する理解が根本的に違うっぽいぞ


956 名前: デフォルトの名無しさん 投稿日: 02/04/24 19:57
WriteFileは改行の変換などはやってくれないので、
そこは自分で配慮する必要がある。
なお、「ファイルに直接書きこむ」はやや意味不明瞭なので、
この「直接」の意味がはっきりするまでは何ともいえない




957 名前: デフォルトの名無しさん 投稿日: 02/04/24 20:00
すんませんでした。
テキストファイルとして,書きこめるのでしょうか?


958 名前: デフォルトの名無しさん 投稿日: 02/04/24 20:30
>>955
まるで COBOLer さんのようだよね


959 名前: デフォルトの名無しさん 投稿日: 02/04/24 20:47
pPD=(struct daaaa *)malloc(sizeof(struct daaaa)*iLine);
こんな感じでmallocしたのですが、n番目の構造体にアクセス
するにはどうすればよいでしょうか。


960 名前: デフォルトの名無しさん 投稿日: 02/04/24 20:48
pPD[n-1]


961 名前: デフォルトの名無しさん 投稿日: 02/04/24 20:49
あぁっ!レスありがとうございます。早速試してみます


962 名前: デフォルトの名無しさん 投稿日: 02/04/24 20:59
デキター!サンクスです>>960


963 名前: デフォルトの名無しさん 投稿日: 02/04/29 18:51
保全


964 名前: デフォルトの名無しさん 投稿日: 02/05/09 23:00
ESCコードを使ってコマンドプロンプト上に
色つきの文字を出力したいんです。ただし
OSはWindowsXP,コンパイラはLSI-C86(試食)。
(Win98の方は確認済)
実際にやってみると

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

ESCの部分が改行記号(半角)になって
しまいますが、やはり不可でしょうか?
(どれかのWin Ver. 以降, DOSが変わったと
 聞いたことがあるんですが。)
よろしくお願いします。



965 名前: デフォルトの名無しさん 投稿日: 02/05/09 23:03
>>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とか。


970 名前: デフォルトの名無しさん 投稿日: 02/05/12 21:32
>>969
単に無視すれば?


971 名前: デフォルトの名無しさん 投稿日: 02/05/12 22:05
うめうめ


972 名前: デフォルトの名無しさん 投稿日: 02/05/19 21:17
前スレ 15 は埋めたが、もう20も逝ってるからな。
早く埋め立てよう。


973 名前: デフォルトの名無しさん 投稿日: 02/05/19 21:19
ネタは無いけど埋め。


974 名前: デフォルトの名無しさん 投稿日: 02/05/19 21:41
お手伝い


975 名前: デフォルトの名無しさん 投稿日: 02/05/19 21:41
お手伝いその2


976 名前: デフォルトの名無しさん 投稿日: 02/05/21 00:38



977 名前: デフォルトの名無しさん 投稿日: 02/05/21 00:39



978 名前: デフォルトの名無しさん 投稿日: 02/05/21 22:34
     ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄
ピュ.ー ( ・∀・)< お待たせ〜♪
  =〔~∪ ̄ ̄〕 \______
  = ◎――◎



979 名前: デフォルトの名無しさん 投稿日: 02/05/22 20:52
  , -=〜=―- 、
 ミ          ヽ
二 ノ (          i
三 ⌒ へ    /` |
二    _     _ |  
三    ┰     ┰ |    
l^          (
} !  ヽ /  {\ ノ
l    i  ( 、 , ) {
∪、      j   |    / ̄ ̄ ̄ ̄ ̄
  |  ‐――――┴、  < sageだこりゃ
  |     ̄`ー―ァ'′  \_____
  \______)



980 名前: デフォルトの名無しさん 投稿日: 02/05/23 00:03
 


981 名前: デフォルトの名無しさん 投稿日: 02/05/23 22:55
981


982 名前: デフォルトの名無しさん 投稿日: 02/05/23 22:55
982


983 名前: 投稿日: 02/05/24 01:22



984 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:23



985 名前: 密かな戦い 投稿日: 02/05/24 01:38



986 名前: 我々は耐え忍ぶ戦いを選んだ 投稿日: 02/05/24 01:51



987 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:51



988 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:52



989 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:52



990 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:53



991 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:53
>>979

それいいなぁ・・・・・



992 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:53



993 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:54
Σ(゚Д゚;)


994 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:54



995 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:55



996 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:56



997 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:56



998 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:57



999 名前: デフォルトの名無しさん 投稿日: 02/05/24 01:57



1000 名前: やった 投稿日: 02/05/24 01:58
              ∧            ∧
              / ・           / ';,
             /  ';          /  ';  1000 ワショーイ…
             /   ;______/   ;
          /                  \
         /    /          \     \
        /´   (  ) |____|  (  )      |
       |  /////  (  |     :|    )  /////    |
       |    (   ) :|      |  (   (       |
        |    )  (  |     |   )   )      |
        |   (   ) ';    /   (   (     /
         \  )  (   \/    )   )  ../
           ヽ              ........:::


1001 名前: 1001 投稿日: Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。



2ちゃんねるは、ここのサーバを使ってるです。。。