C言語なら俺に聞け<34>

このエントリーをはてなブックマークに追加
・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART6
http://pc3.2ch.net/test/read.cgi/tech/1033207156/

・前スレ <33> http://pc3.2ch.net/test/read.cgi/tech/1032606064/

コンパイラ、過去ログなどのリンクは>>2-5 あたり
2デフォルトの名無しさん:02/09/29 04:15
【コンパイラ】
gcc
http://gcc.gnu.org/

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

【ライセンスや機能などに問題あり】
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
>>1
スレ立ておつです
4デフォルトの名無しさん:02/09/29 04:16
【その他】
http://www.cmt.phys.kyushu-u.ac.jp/~M.Sakurai/prog/progf.html
http://www.bloodshed.net/index.html

【注意】
Cmachineは一般的なCと挙動が違いすぎるので動作の保証はできません。
まともな処理系を使いましょう。
ござーるござるよハットリくんはー
ゆかいなみかたーにんじゃでござるー
にんじゃでござるー
Cスレってもしかして、各種言語で一番回転速い?
>>8
特定の言語専用スレではそうかも・・・
未定義のせいだ。
つーか駄スレが多いだけだと思う
Delphi関連スレが最速だと思う。
これでvoidが戻ってきたら・・・・1スレッド一週間もたないかもな。
場違いな5にワラタ
どこかの言語と違ってスレが分散していないからである。
とてもいい傾向だ。まさしく2chでのスレのあり方についての
見本である。
>9
確かに、phpやjavaだと質問するまでもないもんな・・・
ライブラリも豊富やし。
//Cでライブラリつーと、漏れはglibたまにつかっとるが。
Cスレは結構見てるんだけど回転速すぎ。

厨房質問は隔離シル!
16デフォルトの名無しさん:02/09/29 04:39
厨房質問スマソ

どんな型でも扱えるqsortという関数がありますよね?
あれは要素を交換するときは1バイトずつ要素の大きさ分交換すればいいんですか?
とりあえず交換するための関数を下のように書いてみたんですが。

static void swap(unsigned char *v1,unsigned char *v2;size_t n)
{
  unsigned char t;

  for(;n--;v1++,v2++)
    t=*v1,*v1=*v2,*v2=t;
}
>>16
交換させる関数なんて作る必要ないよ?
配列要素の型のサイズを入れるだけ。
>>16
余談だけどv1++,v2++よりv1[n] v2[n] のほうが早いらしい
>>18
そんなの環境によるだろ
その前にコンパイルできないと思うんだが・・・
21デフォルトの名無しさん:02/09/29 04:45
>>17
ごめんなさい。2行目の意味がわからないです・・・

>>18
そうなんですか?n--と一回やるだけだからですか?
22デフォルトの名無しさん:02/09/29 04:47
>>20
コンパイルはできました。きちんと動きました。
ただ、本当にこの方法でよいのかと思い質問しました。
>>21
コンパイラがすげえ賢かったら
実際にインクリメントされるレジスタは一個だけかもしれない
2417:02/09/29 04:48
>>21
#define N 10
int a[N];
qsort(a,N,sizeof(int),comp);
つーかマニュアル読め
>>21
qsort(array, count, sizeof(*array), CompareFunc);
のような感じ。

18はネタだろ。
>>24
qsortを実装するときのことを聞いているんですが・・・
>>26
はあ?
もしかしてコールバック関数のこと?
28デフォルトの名無しさん:02/09/29 04:54
>>27
qsortを自分でつくるときの要素の交換方法です。
型が決まっていればその型の変数を定義してそれを介して交換すればOKなんですが。
29 ◆k/Ubp.Kg :02/09/29 04:56
>>28
もしかして、qsortと同じ働きをするものを自分で作りたいの?
30デフォルトの名無しさん:02/09/29 04:57
>>29
そうです!
というかもうつくりました。
ただ、本当にこんな方法でいいのかと・・・
>>28
>型が決まっていれば
だからサイズを渡すんだろう?
>>28
そういう意味ね。
同じようにコールバックで実装すればいいじゃん。
ただしこの場合でもコールバック関数の方では
あらかじめ型を知っておく必要がある。
型情報をとらない(とれない)だから、memcpy系の方法で
移動させてるんじゃないの?
3432:02/09/29 04:59
あ、ごめん。31の方が正論。
>>32
その型というのは型のサイズのことですよね?
>>16で書いた関数のnがそれにあたります。
>>33
そのためのバッファの大きさがコンパイル時に決まらないのでmemcpyは使えないかと・・・
また失敗は許されないから、mallocも使えないし。
3718:02/09/29 05:01
>>21
19の言うとおり環境依存だけど
nはレジスタに置かれて
Pentium系だと
v1[n],v2[n]は*v1,*v2と速度的に同じくなる
++v1,++v2 がなくなる分だけ早いよ
>>31
決まっているというのは、常に同じ型を扱うという意味です。
3925:02/09/29 05:08
>>37
> Pentium系だと
> v1[n],v2[n]は*v1,*v2と速度的に同じくなる
> ++v1,++v2 がなくなる分だけ早いよ

そうとは限らん。
コンパイラがソースと同じバイナリを吐き出すとは
限らない。極端に言えばどちらでも同じコードが
生成されるかもしれない。
>>39
ん、そりゃもちろんそうです
>>36
あーなるほど解ってなかった。とりあえず "qsort.c" でぐぐると
実装例が出てくるね。たしかに可変サイズのバッファなんか使ってないようだ
結局、自分で実装するなら16のような方法でいいと思うぞ。
他にやるとすれば、intのサイズずつ処理するとか。
glibcのqsort.cは交換の部分をマクロにしているね
>>42
わかりました。ありがとうございます。

添え字を使うか今と同じポインタを使うかは自分の環境で速いほうを使いますね。
45 ◆k/Ubp.Kg :02/09/29 05:24
>>43
実用レベルのライブラリで do { statement; } while(0) 形式のマクロが使われてるのって始めて見た。
俺が気が付いてなかっただけで意外とあるのかも…。てっきりDQNプログラマ用の構文だと思ってたのに。
4644:02/09/29 05:26
そういえば添え字かポインタかよりも、関数の再帰呼び出しでクイックソートを実現していることの方が速度的に問題があるかも・・・・
>>45
俺は結構よく見かけるよ。
>>45
なんにつかうのそれ
breakでぬけたりしたいの?
>>48
あれだ、ブロックにして関数の途中でも変数を定義できるようにすると・・・・
>>49
スコープ作りたいってことか
51 ◆k/Ubp.Kg :02/09/29 06:33
>>48
俺は使わないけど、

#define print_10(string)              \
    do {                              \
        int i;                        \
        for(i = 0 ; i < 10 ; ++i) {   \
            printf("%s\n", string);   \
        }                             \
    } while (0)
そんなマクロ組むくらいならinlineで関数書けばいいのにね
と思ったところではじまらないしおわらないわな
>>52
ネタ?だよね?
>>52
あのさあ、、、
もう突っ込む穴も無くなった。
55デフォルトの名無しさん:02/09/29 07:21
age
>>51で宣言したi(int i; のi)の適用範囲を
明示したいとか理由があるんでしょ。
57デフォルトの名無しさん:02/09/29 12:26
>>1
これもちゃんと書いときなさい!

プログラマ必読・作ってわかるCプログラミング(通称 アヒル本)
http://www.amazon.co.jp/exec/obidos/ASIN/477411328X/
58とりあえず手持ちの:02/09/29 12:28
swap(x,y) \
  do{\
    struct z{char v[sizeof(x)]}t;\
    t = *(struct z*)&(x);\
    *(struct z*)&(x) = *(struct z*)&(y);\
    *(struct z*)&(y) = t;\
  }while(0);
>>58
最後にセミコロンを付けてしまうと、
do{}while(0) を使う意味がなくなる
と思いますが?
ここの人間にはどうでもよいかもしれないが、
一般的にデクリメント命令の方がインクリメント命令より
使用クロック数が少ない。
>>60
ネタだよね? 一般的にって何?
俺が使ってるCPUはどちらも変わらない。
62(x,y):02/09/29 12:44
do{}while(0)は{}の数の対応も検出でき(以下略
6359:02/09/29 12:51
>>62
ごめん。意味わからんのだけど。
6458:02/09/29 12:55
>>59
ごめんマジボケ。
65:02/09/29 13:03
初心者でスマソ・・・・ポインタを使うことによって得られる利点て実際の所どんなもんなんですか?
参考書とかの例題見ても、これなら使う必要ないよな、とか思ってしまうのですが。
memory節約?
67デフォルトの名無しさん:02/09/29 13:18
RubyはCより遙かに高速
>>65
たくさんありすぎて書ききれないな。
たとえば、あらかじめサイズが予測できない
文字列に対して何らかの加工をする関数を
作ろうと思ったら、ポインタが使えないと不可能だね。
69デフォルトの名無しさん:02/09/29 16:05
>>36
qsort の話で無くて申し訳ないけど、、、
*BSD のライブラリに入っている heapsort は malloc を使っていて、
malloc に失敗したら潔くあきらめる(-1 を返す)。 おかげで、扱いが
面倒だけど、キーが同じ要素がたくさんある場合など qsort に比べて
性能が宵場合が少なからずあるので、状況によって使いわけている。
(heapsort はそのアルゴリズム上、要素1個分のメモリが確保できると
交換(と言うか書き込み)の回数が相当減るので、そういう実装も仕方が
無いのよね。)
70デフォルトの名無しさん:02/09/29 16:08
>>65
使う必要はありません。全部グローバル変数でOKです。
71デフォルトの名無しさん:02/09/29 16:25
厨房で申し訳ないのだが、perl でいうところの substr みたいな関数は
あるですか? FreeBSD で C の勉強してまふ。ないなら、それっぽい
処理方法をおしえてくらさい。
char *substr(char *s, int from, int to);
73デフォルトの名無しさん:02/09/29 16:30
>>71
perlでいうところのsubstrが何をする関数かわからん。
文字列のオブジェクトから文字列を切り出して切り出した文字列のオブジェクトを作成して返すんだろうか?
7471:02/09/29 16:31
>>72
そんな関数定義されてないみたいですけど。少なくとも man や、string.h には。

>>73
文字列の何番目から何番目までを取り出す、っていう関数です。
7573:02/09/29 16:35
>>72
それはC標準ではサポートされていない。
76デフォルトの名無しさん:02/09/29 16:35
cなら、先頭はポインタで指定してstrncpy使うしかないと思います。
77デフォルトの名無しさん:02/09/29 16:40
strnlenはGNUの拡張らしいんですが、どの環境なら使えるのでしょうか?
7873:02/09/29 16:40


char *substr(char *s, int from, int to) {

char *pTemp = (char*)malloc(sizeof(char) * ((to - from) + 2));
if(pTemp) {
strncpy(pTemp , &s[from] , to - from + 1);
pTemp[to - from + 2] = '\0';
}
return pTemp;
}
char *substr(char *s, int from, int to)
{
    char *p= s= s + from;
    while (to--)
        ++s;
    *s= '\0';
    return p;
}
8071:02/09/29 16:43
>>78
ぬぉっ。さんくす! 試してみて、漏れライブラリに追加しておきます。
# いい人だね。
8178:02/09/29 16:44
>>71
fromは0から始まるのでおきおつけて
>>79
ねぇ、なんでこんなアフォなことするわけ ?

> while (to--)
> ++s;

s += to; でいいと思うんだけど。

つーか >>79 のプログラムなら、

char *substr(char *s, int from, int n)
{
 s += from;
 s[n] = '\0';
 return s;
}

で十分だよ。

まあ、これでは substr("abcd", 1, 2) とかやるとアウトだし、あんまり実用的じゃねーな。
#include <stdio.h>

#define UNIX 1

int main(void){
   printf(&UNIX["\t%six\n"], (UNIX)["have"] + "fun" - 0x60);

    return 0;
}

なぜunixと表示されるのか、誰か解説してください。
 strnpy(dst, src+from, to-from)[to-from] = '¥0';
>>83
&UNIX["¥t%six¥n"] == &"¥t%six¥n"[UNIX] == "%six¥n"
(UNIX)["have"] == "have"[UNIX] = 'a'
'a' + "fun" - 0x60 = "fun" + 1 = "un"
最後の行修正。
'a' + "fun" - 0x60 == "fun" + ('a' - 0x60) == "fun"[1] == "un"
間違っちゃった…鬱氏…
× "fun"[1]
○ &"fun"[1]
>>85-87
最終的にprintf("%six\n", "un");
になるってことでOK?
>>88
そうだね。
printf(&1["\t%six\n"], (1)["have"] + "fun" - 0x60);
printf("\t%six\n" + 1, "have"[1] + "fun" - 0x60);
printf("%six\n", "fun" + 0x61 - 0x60);
printf("%six\n", "un");
9052:02/09/29 20:52
>>53
どこがネタだかわかんないんだけど
何かおかしなことを言っているんだったら
具体的に指摘をしてください
今日一日考えたけどわかりませんでした
91デフォルトの名無しさん:02/09/29 20:56
>>52
53がネタかCでインライン関数が使えないと思っているだけ。
>>90
C99はまだ広まっていないよ・・・
for を含む関数をインラインにするのはどうかと思う

つうことじゃないの?
なるほど。つまり >91は
コンパイラの拡張機能を勝手に標準だと思っているか、
すべてのコンパイラがC99に準拠していると思っているか、
CとC++の違いをわかっていない、
つまり自分がネタを披露していることに気づいていない
ということですな。
C99 って標準じゃないの?
>>52はインライン関数がC99からではなく、最初から使えたと思いこんでいるところが痛いんだろ。
最初から使えたと思っていなければあんなレスはできないはず。
漏れはC99から始めたので最初から使えましたが、なにか?
つまり移植性をまるで考えに入れてないってことで。
自分のコンパイラで使える機能は他のコンパイラでも
使えると思っている奴って、ある意味すごいな。
実用レベルのライブラリは一生作れないだろうけど。
100デフォルトの名無しさん:02/09/29 21:51
ちっちぇーなー
誰でも知っていることでえらそーにグダグダ書いて。
使ってるコンパイラによるんだから揚げ足取りやっててもおわんねーだろ。
101sage:02/09/29 21:52
>>100=91
逆切れですか。
> 使ってるコンパイラによるんだから
だからinlineを使うのがまずいと言われていることに
気づいているのだろうか。
103デフォルトの名無しさん:02/09/29 22:15
インラインで書くべき処理じゃないということが要点なのでは?
いつから使えたかというのは2次的なことで。
104デフォルトの名無しさん:02/09/29 22:16
代入式って何で
j=i+50;
とは書けないんでしょうか?
超厨房質問でしょうがよろしくお願いします。
105104:02/09/29 22:17
すいません。書き間違えました。
代入式って何で
i+50=j;
とは書けないんでしょうか?
超厨房質問でしょうがよろしくお願いします。
>>104
かけないわけないでしょ。
きちんとjとiを定義した?
107106:02/09/29 22:18
>>105
当たり前。
i+50は左辺にならない。iがポインタで*(i+50)ならできるけど。
108デフォルトの名無しさん:02/09/29 22:19
>>105
その結果どうなることを期待してるの?
109107:02/09/29 22:20
「左辺には」じゃなくて「左辺値には」だな。
>>103
だったらマクロでも同じ事じゃん。
まあネタだったんからどっちでもいいや。
代入先は左辺に書かなければならない
112104:02/09/29 22:25
>>106
すいません。書き間違いです。

>>107-108
=の演算子は「右辺値を左辺値に代入する」っていう決まりなんですか?
内心i+50の結果がjに入るのを期待したんですが・・・
>>112
=は左にあるものに右の結果を代入する演算子だぞ(^_^;)
114104:02/09/29 22:28
>>106-113
ありがとうございます。勉強不足でした。
>>112
つまり、x = yと書くとき、
「x の値が y に入るか、y の値が x に入るかが不定だったらいいなあ♥」
ってことか?
>>115
それが不定だったら俺はCを捨てる(笑)
未定義の方がイイ!
>>112
キミは今すぐPrologを使え。
なるほど
>>115
んで、代入方向を明示的に指示するのには x<=y, x=>y などとするんだな。
もちろん、ifなどの条件式と通常の部分での間違いを防ぐために
12152:02/09/29 23:21
>>92
あーそういうことでしたか
了解しました
x := y, x =: y にするとか
swap(x,y){x:=y:=x;}
よっしゃ!そんなときこそC++のストリーシンタクスだ!
x << y; // xにyを代入
y >> x; // yにxを代入

普通に0を代入して初期化するのと,
ビット操作で0に初期化するのとどっちが早いですか?
126デフォルトの名無しさん:02/09/30 00:45
>>125
コンパイラとCPUに聞け。
>>125
環境による。
でもその程度ならよほどタコなコンパイラでない限り
どちらも同じコードになると思う。
128デフォルトの名無しさん:02/09/30 00:48
>>125
ちなみにビット操作で0にするって、どうするの?
x ^= x
Z80じゃあるまいし。。
>>129
それ、よくやってたなぁ。今じゃ役に立たない知識だけど。
>>129
まじでそんなコードを書く人がいるの?
同じ数同士XORを取れば確かに0になるが・・・・
>>127
ていうか、最適化時に xor にしないコンパイラなんて存在するんだろうか
xoreax, eax

VC++6.0はXORにするみたいだな。
>>131
大昔はそうするのが常識だったんだ。
いうなれば定石みたいなもんだったからな。
xor a
>>131
>>132の言う通り。
適当なプログラムコンパイルした後
アセンブラにどう変換されているのか試してみれ。
>>134-135
そうなんだ。
そんなに問題になるほどの差があったのかな・・・

>>136
やってみました。>>133がそれです。
アセンブラはよくわからないけど、これくらいならなんとか。
eaxレジスタにあるもの同士でXOR取ってまたeaxにいれるんですよね?
138デフォルトの名無しさん:02/09/30 01:51
>>132
gccでは最適化すると、XOR使ったソースでも 0をロードするアセンブラ
吐くようだ。
>>137
結構有ったのよ。
有名なところでスーパーマリオをROMの中に詰め込む苦労話とか、
その当時はみんな同じような苦労をしていた。

それが今や、、Str[10]で足りると思うんだけど、余裕もって
Str[1000]で宣言しとくか! とかやってる俺。
>>139
あ、おれも・・・
256とか1024とか、256の倍数で取っている。本当は30くらいでよいのだけれど(^_^;)
俺も
面倒だから,全部1000にしているよ
142fuck!:02/09/30 02:00
Why I hate C
There is almost no run-time error checking. In particular, arguments passed to functions are not type-checked, and array offsets are not compared with the bounds of the array.

There is no real string type. So the syntax is convoluted for common tasks like appending one string to another. Also, there are subtle differences between "char stuff[]" and "char *stuff" that are hard for a beginner to debug.

The necessity for function prototypes means you have to put essentially the same information in two places, so every time you make certain changes you need to edit multiple files.

Possibly the fascistic insistence on prototypes was some sort of attempt to compensate for the lack of *run-time* error-checking.

Personally, I think the syntax is pointlessly convoluted.


while ((*dest++ = *src++) != '\0') {

seems so far removed from any English-language representation of what's happening that the assembler code is literally easier to understand.

Likewise, the "#include <stdio.h>" seems silly. It would be much more general to have syntax more like "#include "%LIB%/stdio.h"

143fuck!:02/09/30 02:01
The world would be a much better place if the people who invented C had learned to type first. (Ie, the syntax seems to have been designed to minimize keystrokes, no matter what the effect on readability.)

The language does not really support multidimensional arrays.


The comment characters require two keystrokes. Even worse, they don't nest, so it's hard to quickly comment out sections of
code when you're debugging -- unless of course you don't put actual comments in your code, until "I finish debugging and do the cleanup".

Also, personally I would like comments that last to the end of the line (like the semicolons in assembler).

And why do preprocessor commands use the "#" character, that everyone else uses as a comment? Seems like a last-minute kludge to me.

These "void pointers" seem to me like a kludge bolted onto a confession of defeat. What is the point of declaring the type of parameters when you don't know what it is??


On P142 of K&R (2nd ed) there's a sentence that sounds to me like sarcasm: "The question of the type declaration for a function like malloc is a vexing one for any language that takes its type-checking seriously."

Obviously C does not take type-checking seriously, and clearly K&R are hardly vexed at all by having to recommend a kludge that kicks type-checking in the groin.
144英語わからん:02/09/30 02:01
なんだなんだ?荒らしか?
145132:02/09/30 02:07
>>138
うぞーん
146127:02/09/30 02:09
>>134,135
x86では今でも XORでクリアするのが定石だと思う。
フラグを破壊したくない時だけ mov eax,0 かな。
Pen4ではどうなったか知らないけど。
147135:02/09/30 02:13
あうん、なんか過去形で書いてたな。
Pentium 4 なら 0.5 クロック命令だね
148146:02/09/30 02:16
>>147
Pen4でも 即値のロードと XORのクロックは変わらず?
もしそうだったらやはりXORが定石かな?
149135:02/09/30 02:20
xor でいいんじゃないかな?
命令長は xor なら 2 バイト、即値なら movzx で 3 バイトだから
150146:02/09/30 02:24
>>149
了解です。(MOVZX→MOV だよね)
ありがとう。
BOX Box[10]; //構造体

for(i=0;i<10-1;i++)
{
box[i]=box[i+1];
}


*pbox=box;

for(i=0;i<10-1;i++)
{
pbox[i]=pbox[i+1];
}

ポインタを使ったほうが早い?
>>151
環境による。
というか何それ? ほとんど同じじゃん。
> *pbox=box;

pbox=&box;
だよね。
素直にmemmoveでもいいんじゃない?
>>149
命令長とかクロック数はどこで調べられますか?
>>154
Intelの日本語サイトに資料があると思うよ。
>>153
memcpyってつかってはいけないんですたっけ?
memmove>memcpy?
157153:02/09/30 03:07
>>156
重なり合う領域だからmemcpyはまずい。
あ,そうか
これからポインタの本ちょっと見返してみるよ
159135:02/09/30 03:24
>>154
命令長は Intel のリファレンス PDF を見るといいよ。(これ必携)

ttp://www.intel.co.jp/jp/developer/design/pentiumiii/manuals/index.htm
IA-32 インテル(R) アーキテクチャ・ソフトウェア・デべロッパーズ・マニュアル
上巻、中巻、下巻

クロック数は、CPU によって違うから一概にはいえない。
>>155>>159
ありがとうございます。
今ISDNで必死にダウンロード中です。(笑

ところでZ80とかの純粋なCISCならともかく
P4みたいなパイプライン付きCISCや
RISCのプロセッサでは正確な実行時間は
把握できるものなのでしょうか。
メモリのウェイトとかOSによっては
タスク切り替えとかはどう考えるつもりだ?
どこかで見たような話だが、確かベンチマークとかだと
正確な実行時間は推測できないとかいう話だよな。
昔はCPUの資料見て高速な命令使って最適化してたけど
クロックインフレのご時世にはそんなことは無意味だった気がする・・
164デフォルトの名無しさん:02/09/30 08:03
無意味ってこたーないだろ
それは該当する関数の使用頻度によるのではないかと。
>>163
無意味ってことは絶対にないけど、そういう作業は
コンパイラがガンガンやってくれるからね。
人間がやるべきは、CPU 命令単位の最適化よりも
アルゴリズムの最適化であることは間違いない。

MMX を使った画像処理のループとかになると、
やっぱり CPU の資料は手放せないけどね
MMXってなんでそんなに特殊なのですか?
そういったものも含めて変わった事が色々出来るみたいだけれど。
>>167
別に特殊じゃない(と思う)けど、MMX 使おうと思ったら
Intel の MMX 最適化コンパイラでも使わない限りは
インラインアセンブラで書くことになるでしょ。

コンパイラはアセンブラで書いた部分の最適化は
やってくれないから、自分でペアリングやクロック数を
考えたりしながら最適化することになるわけで。
169デフォルトの名無しさん:02/09/30 14:59
C言語の32個の予約語のうち、
volatile と unsigned signed enum が読めません。
どう読むのですか?
170デフォルトの名無しさん:02/09/30 15:05
>>169
まず英和辞典で調べろ。
ちなみに enum は enumeration の略だ。
172デフォルトの名無しさん:02/09/30 15:06
auto オート
break ブレーク
case ケース
char キャラ           チャー,キャラクタ
const コンスト
continue コンティニュー
default デフォルト
do ドゥー
double ダブル
else エルス
enum イナム エナム
extern エクスターン
float フロート
for フォー
goto ゴートゥー
if イフ
int イント インテ,インテジャ
long ロング
register レジスタ
return リターン
short ショート
signed サインド
sizeof サイズオブ
static スタティック
struct ストラクト
switch     スイッチ
typedef タイプデフ タイプデファイン
union ユニオン うにおん
unsigned アンサインド
void ボイド
volatile ボラタイル,ボラティル バラトル
while ホワイル
173デフォルトの名無しさん:02/09/30 15:09
>>169
揮発性 volatile
174mem:02/09/30 15:12
ポインタについて今勉強しているのですが、
今読んでいる本のところで
float balance[10][5];
float *p;

p=(float *) balance; ←←
*(p + (3*5)+1)

←←の所がよくわかりません。
float *(balance);
でわおかしいのですか?
基本的なことで申し訳ないのですが、
どなたかよろしくお願いいたします。
>>174
型キャストでス・・・・・・・
177デフォルトの名無しさん:02/09/30 17:59
C言語で putc()関数とgetc()関数を使って、
バイナリファイルのコピーを行っているのですが、
コピー後のファイルの末尾にゴミ(0xff)がついてしまいます。

これが付かないようにするにはどうすれば良いんでしょう
>>177
多分 EOFのゴミです。if (feof(fp)) を使って EOFをスキップすれば
いいはず。
>>177
スマソ。feof(stdin)だね。
>>178==179
EOFをスキップするように書き換えたらうまくいきました。
ほんとうにありがとうございました
>>180
ちなみに getc()もEOFを返すことができるので、int型の変数に読み込み、
if ((i = getc()) == EOF) でスキップすることもできる。これなら feof()は
必要ない。

char型の変数に読み込むとうまく行かないので注意。
182デフォルトの名無しさん:02/09/30 20:06
int max(int x,int y)
を関数値の型を書かないとint型と見なされてしまうそうなんですが、本当でしょうか?
また、なぜint型と見なされるのでしょうか?
お願いします。
char 型の配列を double 型の配列に変換するにはどーしたらいいですか
for(i=0;i<N;i++)darray[i]=carray[i];
>>182
ANSI-C以前のCがそうだったから。
>>183
↓これじゃだめなの?

void main(void)
{
char c[10];
double d[10];
int cnt;

for ( cnt=0; cnt < 10; cnt++ )
{
d[cnt] = (double)(c[cnt]);
}
}
やっぱそれしかないみたいですね・・・
どうもでした
stdlib.hをインクルードして、atofを使えばいいんじゃないの?
189デフォルトの名無しさん:02/09/30 20:21
ANSI以前からの決まりだったんですか。ありがとうございました。
>>188
ダウト。atofはchar *からdoubleへの変換では?
>>186
ダメ。




mainの戻り値はint
>>191
そういう本題とズレたことはやめた方が・・・
誰か(オレモナー)が突っ込むと長くなるし。
>>192
突っ込め突っ込め。議論は活発な方がよい
194デフォルトの名無しさん:02/09/30 21:31
a[0],a[1].a[2],a[3],a[4],a[5]
な配列を
a[3],a[4],a[5],a[0],a[1].a[2]
に入れ替える効率のいい方法を教えてください
>>194
まずはその部分がボトルネックになっているかを調べろ。
>>194

1.バッファを用意する
2.ループで条件を付けてa[i]をバッファに代入
3.バッファをa[]へコピー。

環境依存で型が分かればそれ以外も無くはない。
安直に考えるとこうだが
TypeOfA a[6];
int i;
for (i = 0; i < 3; i++) {
  TypeOfA t = a[i];
  a[i] = a[i + 3];
  a[i + 3] = t;
}
展開しろ。
199デフォルトの名無しさん:02/09/30 21:48
a[1].a[2]?
200200:02/09/30 21:51
200
>>199
突っ込みが鋭いな。
漏れは全然気づかなかたよ(w
202デフォルトの名無しさん:02/09/30 22:05
デバッグすると
「ハンドルされていない例外はgrcve.exeにあります:
0xC0000005:Access Violation。」
という表示が出ます。
どういう意味なのでしょう?
それに、どうしたらバグがとれるのでしょうか?
203デフォルトの名無しさん:02/09/30 22:08
>>202
とりあえず確保した領域を越えて書き込んでいないか確かめろ

char array[5];
array[100]='a';
とかな。
>>202
不正なアドレスを参照しようとした。
不正なアドレスに書き込みしようとした。
メモリを2回解放した。
ハンドルを余分に解放した。
のどれかと思われ
205202:02/09/30 22:15
領域を広くするとバグがなくなりました。
ありがとうございます
>>205
uwa〜、怪しい。
ちゃんとどこが悪いのか掴んだんだろーな。
たまたま、動いてるだけかも知れんぞ。
>>205

sz = 100;
p=malloc(sizeof(sz));

こんなことしてないだろうな?
>>206 同意
>>205 それをバグがなくなったとは思うのは
気が早いと思われ。
ありゃ、新スレ来てみたら、もう200超え。
お世話になりマウス。m(^_^)mペコ。
文字列ポインタを数値に変換するにはどうしたらいいの?
strtokで数値でできた文字列を分割したあと
数値の入れ方がわからないんだけど誰か教えて下さい.
>>210
意味が良くわからないのだが、printf("%p", pointer);ってことか?
212210:02/10/01 01:13
すいません.
数値で出来たテキストファイルを数値配列に読み込み
計算をしたいと言う意味です.
sscanf
数値変数 = atoi(文字列へのポインタ);
なんじゃないのか?
数値変数 = (数値変数)文字列ポインタ;
なのか??
>文字列ポインタを数値に変換する
っていうのがいまひとつ分からんが、
↓こんな感じかい?

char *tok;
int num;

tok = strtok(str, sepa);
num = atoi(tok);
普通はatoi,atol系使うよな。
217210:02/10/01 01:29
こんな初歩的な質問にまで答えていただいて
ありがとうございます.
早速やってみます.
218210:02/10/01 01:48
再度すいません.
下のソースはエラーが出るんですが何がいけないですか?

while(fgets(buf,1000,fp1)!=NULL){
 p=strtok(buf," ");
 data[a][b]=atof(p);
  do{
   b++;
   p=strtok('\0'," ");
   if(p){
   data[a][b]=atof(p);
   }
  }while(p);
 a++;
}
>>218
どこでどういうエラーが出るのかくらい書いたら?
>p=strtok('\0'," ");
これどーなのよ。
第一引数は、文字列でしょ。'\0'は、NULLだべ
PC-UNIX上で動く画面制御のライブラリってないんでしょうか
カーソル移動したり、画面クリアするやつなんですけど。
222210:02/10/01 02:00
p=strtok('\0'," ")
のところでエラーが出ます.
本で見たらこうなってたのでやってみました.
ただファイルへの書き込みではうまくいくんですけど.
>221
ライブラリじゃないですが、↓こんなのどうでしょ。ソースコードつき
なので、さんこうになるのでは?
http://www2.plala.or.jp/mita/download/hi/info.html
224デフォルトの名無しさん:02/10/01 02:06
>>221
cursesをキーワードに検索すべし。
225デフォルトの名無しさん:02/10/01 02:08
>>222
その本がC言語を主題として書いてるのなら、捨てたほうがいいと思う。
226210:02/10/01 02:12
なんかそんな気がしてきました.
それでエラーの位置なのですが,

while(fgets(buf,1000,fp1)!=NULL){
 p=strtok(buf," ");
 data[a][b]=atof(p);
  do{
   b++;
   p=strtok('\0'," ");
   if(p){
   data[a][b]=atof(p);ここでエラーになります.
   }
  }while(p);
 a++;
}
何がいけないのですか?
227220:02/10/01 02:16
自爆しましたぁ〜
strtok('\0'," ");
の第一引数のNULLは、「次のトークンを探す」場合にそうしてするみたい。
m(__)m
228210:02/10/01 02:20
じゃあ何でエラーになるのでしょうか?
229デフォルトの名無しさん:02/10/01 02:20
>>226
strtok()は、トークンが見つからないと、NULLを返すので、
atof(NULL)
となってしまうので良くないのでは?
231デフォルトの名無しさん:02/10/01 02:23
strtokの第一引数はポインタ。
strtok('\0'," ");
ではint型の '\0' を第一引数として渡しているので間違い。

strtok(0, " ");

strtok(NULL, " ");
に変更すべし。
232230:02/10/01 02:45
あぁ、また自爆だぁ〜
if(p)があるから、atof(NULL)とはならないのかぁ〜〜〜〜〜〜。m(__)m
にしても・・・、strtok()の結果って、ホントに数字の羅列になってるのかな?
データの中に、空白文字が複数連続して書かれてあったらどうなるんだろ?

スレ汚してごめんなさい。m(__)m
233 :02/10/01 02:52
>>226
aかbがdataのサイズを超えているのではないかな?
どう見ても b = 0 が抜けているが。
つーか、なんでどういうエラーなのかを言わんのだ?
>>226
コンパイルエラーだったら怒るぞ
235210:02/10/01 04:01
エラーの内容は
「?????のメモリが????を参照しました.
メモリがwrittenになることが出来ませんでした.」
です.
自分でもいろいろやってみるのですが,エラーなんです.
教えてください.
>>235
>>233さんのいってることは確認したかい?
>   p=strtok('\0'," ");
何したいんだ?
×  p=strtok('\0'," ");
○  p=strtok(p," ");

誰も突っ込まんから一応突っ込んでおく。
whileが無限ループになってるからいつかはエラー出るだろうなあ。
239210:02/10/01 04:21
b=0は宣言のときに書いてあります.
それでただ読み込んでファイルに書き込むことは出来ました.
よって読み込みの段階での間違えは無いと思います.
つまりatofのところ(226で書いたところ)でうまくいかないみたいです.
何が間違っているのでしょうか?
>>239
で、dataはどのくらいのサイズ設定してあるんだ?
仮にdata[10][10]としてあったときに、b=10のときエラーになることくらいは分かってるよね?
10*10と仮定すると、
if( a < 10 && b < 10 ){
   data[a][b]=atof(p);ここでエラーになります.
}
ってやれば回避できる。
>>239
人の話きけよ…
242210:02/10/01 04:31
241さんは238さんでしょうか?
すいません.
書き込んでいる最中に増えていました.
そのとおりにやってもエラーが出ます.
あとサイズ設定はかなり大きくとっているので(300,100)大丈夫です.
>>210
俺がstrtokで作るとこうなる・・・かもしれない↓
  for (a = 0; fgets (buf, sizeof (buf), fp1) != NULL; a++) {
    char *p = strtok (buf, " ");
    for (b = 0; p != NULL; b++) {
      data[a][b] = atof (p);
      /**/printf ("(%d,%d) = %g\n", a, b, data[a][b]);
      p = strtok (NULL, " ");
    }
  }

しかし、バグはバグとして、そもそもsscanfを使わない理由は?
おっとすまん、サイズが決まってなければsscanfでは簡単にはできないか
245243=244:02/10/01 05:08
そういえば、最初
#include <stdlib.h>
をやりわすれたのにコンパイルエラー出なかったのが不思議。
(結果は出鱈目だった)
246デフォルトの名無しさん:02/10/01 07:42
文字列の中身は?
えっスペース区切りじゃないの
まーそもそも、data[a][b]というデータ構造があやしいのだが
(サイズが不定なのか固定なのかわからん)
249デフォルトの名無しさん:02/10/01 09:12
bがインクリメントされっぱなしのような気がするが?
何で、do{〜}while(p);とするのか・・・
while(p){〜}でいいじゃん。
pを確認してから、strtokを取るってわかりやすいし。結構行数はしょれる。

>○  p=strtok(p," ");
何でpとpなんだ?

b=0;の適当なところでの処理は必須。

' '半角スペースが2個連続している所とかは無いのか?
あれば、strtokに掛ける前に処理しておいた方が良いと思うが。

strtok(NULL, " ");がいいな。

全角スペースは混ざっていないよね?

 などなど
251デフォルトの名無しさん:02/10/01 12:15
すいません。教えて下さい。
プログラムを実行して、WWW上のどこかに飛ばすにはどうしたらいいでしょうか?
初心者用のサイトは大方見たのですがドコも詳しく書いてなくて、
どなたか、お願いします。
RFCでIPの使用域について調べて、IP生成して、試しにping打って、getしてみて、
そこにサイトがあったら、飛ばせ。
253デフォルトの名無しさん:02/10/01 12:17
>>251
printf("Location:どこか\n\n");

これをCGIとして実行。
> WWW上のどこかに飛ばすにはどうしたらいいでしょうか
何を飛ばすのか、そもそも「飛ばす」とはどんな処理・動作・結果を指しているのか?
具体的に書けや (#゚Д゚)ゴルァ!!
>>254
> 何を飛ばすのか
電波
256251:02/10/01 12:28
>252-254
回答ありがとうございます。
言い方悪くてすいません。
exeを実行語、ヤフーなりgoogleなりIEが開いて表示する
って言うのをやりたいです。
>252
おもしろそうなので詳しく調べて見ます!!
>253
個人的に使いたいのでCGIは無理ですが、勉強になりました。
もしもCGIを使う事になったら使用させていただきます!!
>254
ごめんなさい(T_T
次からはもっと詳しく書かせていただきます!!
>>256
IEコンポーネントを使うことになるから、↓のすれがよさげ

IEコンポーネントを使い倒すスレ
http://pc3.2ch.net/test/read.cgi/tech/982930049/l50
>>256
最初の1回だけなら、
ShellExecuteでIEのフルパスと対象のURLを書けばイイかも
printfのフォーマット指定で「小数点以下の無効なゼロは表示しない」って無いんですか?
0.01fを%fでやると0.010000ってなっちゃいますよね?
260デフォルトの名無しさん:02/10/01 14:08
>>259
%gは?
261デフォルトの名無しさん:02/10/01 14:19
コンソールアプリとWindowsSDKをやるだけなんですけど、
VC++を買う必要はありますか?

今の環境はBCCに専用のエディタを組み合わせてます。
>>261
その今の環境でできないの?
>261
根性があれば必要ない
プラットフォームSDKはBCCに含まれてるから
がんばってMSDNライブラリに検索かけまくる
(抜けがあるけど・・・)
>>261
> VC++を買う必要はありますか?
ない

ウィンドウズプログラムの作り方
http://www.neco.nu/gohodoji/bccfaq/bccfaq.html#windowsprogram

# -Wオプションを付けるのを忘れるな
>>261
この辺りからリンクされているツールを使うと、BCCでも比較的
楽にWinアプリも作れると思う。
http://hi-tag.hoops.jp/prgmemo/cpp_try00.html
266デフォルトの名無しさん:02/10/01 23:12
構造体で、
typedef struct test {
char test1[10];
char test2[10];
} test;

typedef struct value {
char test1[10];
char test2[10];
test test3[10];
} value;

として、

value a[10];
と宣言して、

a[0].test3[0].test1[0] = 'a';

というのは、できないのでしょうか?




267デフォルトの名無しさん:02/10/01 23:19
メンバの命名は気をつけた方がいいとおもうが、べつにいいんじゃない?
268デフォルトの名無しさん:02/10/01 23:27
あの、聞きたいんですけど。
VC++6.0で簡単なウインドウを作るプログラムを作ろうと思ったんですが、
新規作成→WIN32Application→新規作成→C++ソース、と普通にやって
#include<windows.h>をするとエラーがでます。エラーの場所はなんか
winnt.hというところに出ます。そんな所いじってないのになぜでしょうか。
教えてください!
ふ〜ん。
教えて欲しいくせに「C言語なら俺に聞け」スレに書き込むのか。
ふ〜ん。つまらんネタだな。

char (*Numbox)[MAX2];

初期化するにはどうしたらいいでしょうか?
>>272
char [MAX2] の先頭を指すポインタだから

 char hoge[MAX2];
 Numbox = hoge;
>>272
char (*Numbox)[MAX2] = {0};

最近はなんとかっつー規定でゼロクリアしてくれるぞ。
駄目ならsizeofでmemsetだ
275272:02/10/02 00:22
NULL=0?
C言語だけですっけ?
> 最近はなんとかっつー規定でゼロクリアしてくれるぞ。
ANSIのことか?
274はNumboxが配列だと思っているのかもな
>>273-274
おいおい、何言ってんだ?
配列へのポインタだぞ。書くとしたら、
char (*Numbox){MAX2] = NULL;
char (*Numbox){MAX2] = &hoge;// <- char hoge[MAX2];
char (*Numbox)[MAX2] = (char (*)[MAX2])malloc(10*sizeof(char (*)[MAX2]));
だろうが。
ミスった。3つ目は
char (*Numbox)[MAX2] = (char (*)[MAX2])malloc(10*sizeof(char [MAX2]));
だな。
char abc=100;
const char *a=abc;

*a=10;

OK?
>>280
const char *a = &abc; ・・・・
282273:02/10/02 02:48
>>278
あぁ、& が要るわ。失敬。
>>282
&が要るかどうかはhogeの型によるだろ。たとえば
  char hoge[10][MAX2];
だったら &は不要。
284283:02/10/02 04:47
あ、俺がよく読んでなかっただけだわ。
char hoge[MAX2];
と最初に書いてあった。ごめん。
(´-`) oO(流行ってるのかな… 自己ツッコミ)
(´-`) oO(みんなせっかちなんだよ。「早飯早糞早レス」プログラマに不可欠(ってどっかのスレで言ってた)
(´-`) oO(流行ってるのかな… このキモイ顔文字)
288デフォルトの名無しさん:02/10/02 10:14
教えて下さい。
ファイルのステタースを確認したいのですが、
使い勝手のいい関数はあるでしょうか?
用途なんですが、ファイルに書き込む作業で、多人数が同時に
アクセスする可能性があるので、ファイルロックのような
機能を持たせたいと考えております。
どなたか教えて下さい
289デフォルトの名無しさん:02/10/02 10:22
厨デス

slen=strlen ( argv[2] );
と宣言したとして、
その確保した先頭のアドレスに
char ZERO = '0';
を入れたいんですけどドウスレバヨロシイノデショウカ?
>>289
argv[2][0] = ZERO;
291289:02/10/02 10:29
>290サソ

アリがd

コソパイルできたけどcore dump吐キヤガッタ
ヽ(`Д´)ノ ウワァァン!!

ガンバッテミマス
>>288
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/flock.2.html
ただ、ファイルロックを行わないツールで書き込まれたらどっちみちアウト
293デフォルトの名無しさん:02/10/02 10:59
>>292
解凍ありがとうございます。
私もFlockには目をつけていたのですが何故か使えません。
UNIXではないんですが…
ヘッダーが無いとVCがおっしゃるので。
ショートカットのリンク作るやつでやろうかなとか考えてます。
ありがとうでした。
>>292
linuxのflock()って排他ロックしても書き込まれちゃうの?

>>293
「UNIXではない」から使えないんでしょ。Winなら
http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_lockfileex.htm
これかな。
295ポチョムキン:02/10/02 15:42
1週間ほど前、こちらでgnuplotを使ってリアルタイムにプロットする方法を教えていただいた者なんですが、おかげさまでpopenを使ってデータをGnuplotに遅れるようになりました。しかし、gnuplotにエラーが
生じたときロボット制御の画面が崩れてしまいます。bash等の場合の
標準エラー出力の解決法はwebで見かけたのですが、gnuplotでは
うまくできませんでした。
gnuplotの標準エラーを出力させないようにするにはどうしたら
よいのでしょうか?

どなたかアドバイスしていただけると助かります。
よろしくお願いします。
>>296
popen("(gnuplot > /dev/tty) >& /dev/null", "w");
じゃダメかい?
自分でforkして、dupって、execしたら?
だれか教えてください!
#include<stdio.h>
#include<stdlib.h>
int main()
{
char file[64];
char buf[256];
FILE *fp;

if(null==(fp=fopen("test.txt","w")))
{
printf("File Open Error!\n");
exit(1);
}
else
{
buf[0]='1';
while(buf[0] !='0')
{
printf("文字列を入力してくれ_");
gets(buf);
fputs(buf,fp);
fputs("\n",fp);
}
}
fclose(fp);
}
とVC++でコンパイルしたんですがエラーになってできません。
デバッグ情報みてもよく意味が分かりません。
どなたか分かる人いませんか?
>>298
298.c
298.c(9) : error C2065: 'null' : 定義されていない識別子です。
298.c(9) : warning C4047: '==' : 間接参照のレベルが 'int ' と 'struct _iobuf *' で
異なっています。

そのまんまだと思うけど…
300288:02/10/02 19:30
すみませんどのように修正すればちゃんとコンパイルできるんでしょうか?
超初心者ですみません・・・
NULL
302298:02/10/02 19:33
ありがとうございましたちゃんとできました感謝〜
303ポチョムキン:02/10/02 19:52
解決しました。お騒がせしました。
304ポチョムキン:02/10/02 19:54
>296
ばっちりでした。ありがとうございました。
Windowsのコンソール用のアプリケーション用の画面制御ライブラリ
というのはありませんでしょうか(できればフリーで)
>>305
エスケープシーケンスでいいやん
>>306
Windows2000のDOSプロンプトでは使えません
308デフォルトの名無しさん:02/10/02 22:28
>>307
つかえるぞよ
>>308
何か常駐ソフトが必要なのでは?ansi.sysとか。
win2kのDOSプロンプトは使えるけど、
win2kのコマンドプロンプトでは使えない、
と言う話では無かろうな。
すくなくともVCから立ち上がるDOSプロンプトでは使えません
WinNT系では Win32 プログラムからエスケープシーケンスは使えない。
代わりに Console API を使う必要あり。
16bit プログラムなら ansi.sys を組み込めば使用可能。
って、数日前にもどっかで書いたような。
cygwinでcursesを。
いや使えるかどうかしらんけど、
vimとか動いてるからたぶん使えるんだろう。
314デフォルトの名無しさん:02/10/03 01:23
>>305
BCC32の付属ライブラリじゃだめなのか?
エディタ制作中の初心者がいろいろ使っていたぞ。
315デフォルトの名無しさん:02/10/03 01:27
ansi.sysってどうやて組み込むの?
>>294
linuxのflockはflockをよんだ時に、ほかのプロセスが排他ロックをしていたらロックが解除されるまで待つというだけ。
flockを呼ばずに書き込みを行えば書き換えられてしまう。
ひとつのプログラムからしか書き換えないようなファイルに対しては有効。
317デフォルトの名無しさん:02/10/03 02:41
>>177でバイナリファイルのコピーの質問をしたものですが

EOFをスキップするように書きかえると0xffをEOFと誤診しているような
非常に怪しい挙動を起こすのですが、何かいい方法は無いでしょうか。
318デフォルトの名無しさん:02/10/03 02:43
>>317
きちんとint型でうけとっているか?
>>318
charで受け取っていたのが原因でした。
初歩的なミスに回答して頂いて有難うございました。
>>317
>>181

補足すると、EOFはchar型では表せないint型の定数。正しくはint型という
わけではないが、getchar()がint型を返すため、EOFもint型だと考えれば
便利。
321デフォルトの名無しさん:02/10/03 02:55

●●●●●●●●「オセロさえ納期内に作れない=OO役立たず 」祭り●●●●●●●
/|         |  |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ
  |         |  | ̄ ̄ ̄ /|                    ||
  |         |  |   / /|TTTTTT   TTTTTTTTTT||TTTTT
  |        /\ |  /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^
  |      /  / |// / /|
  |   /  / |_|/|/|/|/|
  |  /  /  |文|/ // /
  |/  /.  _.| ̄|/|/|/         Λ_Λ
/|\/  / /  |/ /           (___)
/|    / /  /ヽ            /〔 非OO 〕〕つ
  |   | ̄|  | |ヽ/l            `/二二ヽ
  |   |  |/| |__|/   Λ_Λ     / /(_)
  |   |/|  |/      ( ´∀`)   (_)    Λ_Λ
  |   |  |/      // /  ^ ̄]゚        (`   )
  |   |/        ゚/ ̄ ̄_ヽ         ⊂〔〔 非OO 〕
>>321
OO?
>>322
Object Orientedかなあ?なんでCスレに?
ム板のほとんどのスレにコピペあり
覚えたら即書こう

c="Asadayo"[2];

c=i"Asadayo";
(ノ゚Д゚)朝だよ
グローバル変数,グローバル関数には,先頭に
gnum;
gSeachcat();

とかでいいんでしょうか?
グローバル関数ねぇ・・・
329デフォルトの名無しさん:02/10/03 05:11
グローバル関数ねぇ・・・
330デフォルトの名無しさん:02/10/03 05:15
素股ねえ・・・
331デフォルトの名無しさん:02/10/03 06:39
C言語はなんでこんなに未定義が多いんですか?
>>331
本当のところはわからんけど
現在の仕様で未定義とされてる部分を、エラーからの復帰方法とか細かく定めたら、
それにスマートに対処する方法がない環境では複雑になったり遅くなったり、
全く対応できなかったりするからじゃなかろうかと
333デフォルトの名無しさん:02/10/03 06:59
>>332
ああなるほど。
様々な環境で使えるようにするためにはそうするしかないわけか。
意味のある未定義なんかない。
335ネターリ:02/10/03 10:37
88 - 66 = 11

式が成立しません!
これに手を加えず成立させるにはどうすればいいれすか?
*(int*)(88-66)=11
#if 0
88 - 66 = 11
#else
(void)0
#endif
;
338デフォルトの名無しさん:02/10/03 11:41
>>335
せめて 88 - 66 = 22 とかけよ・・・
>>335
88 - 66 = 11 + 11
手は加えてませんよ。












11を加えたんです。
struct A
{
A const& operator -( int ) const{ return *this; }
bool operator =( int ) const{ return true; }
};

A() - 88 - 66 = 11

C++ならなんとか・・・なるかな?
#define 88 77
88 - 66 = 11
>>341
記号定数は英字か_で始まらないといけないんだYO!
それ以前に = は代入だから成立してないよ
#define COMMENT(expr) /* expr */
COMMENT(88 - 66 = 11)
345デフォルトの名無しさん:02/10/03 13:19
>>344
素直に /* 88 - 66 = 11 */ じゃだめ?
ワラタ
>>345
ソウイエバソウダネ
348デフォルトの名無しさん:02/10/03 16:30
main関数から
returnで抜けるのと、
exitで抜けるのでは、
なにか違いがあるんでしょうか?
349デフォルトの名無しさん:02/10/03 16:54
>>348
ないよ
>>348
ちょっとある。
exit()は一応関数コールなので、スタックがぎりぎりだとあぼ〜んする
ことあり。と言ってもほとんどそんな事は皆無だが。
>>348
つい最近、同じような質問を見た記憶が。
35310000000:02/10/03 20:37
あいさつもなしに質問なんですがCでフォルダを指定して
そのフォルダに入っているファイルの名前をすべて挙げるには
どうすればいいでしょうか?
>>353
Cの標準関数にはフォルダにアクセスする関数はない。
OS依存ではいくつか方法はあるけど、私には君のOSはわからない
3551000000:02/10/03 20:43
>>354
あいさつも無しにお礼です、ありがとう。
答えてくれて。
私はwin98SEだけど基本的にwin全般での方法はありませんか?
NTとか3.2とかはいいんですけど・・
>353
popen("ls", "r")もしくはpopen("dir", "r")でがんがれ。
357デフォルトの名無しさん:02/10/03 20:48
プログラミングの勉強したいんですけど。
まとめてください。、何を詠んだあと何を読めばいいですか?
勉強方法の王道でおねがいします
358デフォルトの名無しさん:02/10/03 20:51
>>357
そんな大仕事をおまえのためにやれと?
359デフォルトの名無しさん:02/10/03 20:53
すいません・・でも・・有名な。。本の紹介でいいんで。。
まとめを。スレの1に書いといてくれれば。もっと、いいです、、
360デフォルトの名無しさん:02/10/03 20:55
>>359
お勧めの書籍スレがあるから、そこに書いてある本を
かたっぱしから読めばいいかも。
361100000:02/10/03 21:00
>>356
あいさつも無しに、うれしいです。
調べてみたところ私には全くの未知の関数でしたので
勉強してみます、パイプという言葉をCの中で知りませんでしたし。
それでわ。
>>357
そういう質問してる時点で、王道から激しく外れてるが。
>>359
> すいません・・でも・・有名な。。本の紹介でいいんで。。
スレの1に書いてあることも読めん奴はいくら本を読んでも
身に付かないと思うが...

 Cプログラマ必読 ・プログラミング言語C(通称 K&R)
 http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
 推薦図書/必読書のためのスレッド PART6
 http://pc3.2ch.net/test/read.cgi/tech/1033207156/
>>361
だまされてるよ。
>>364
だね。パイプじゃなくてバイブだよ!>>361
366356:02/10/03 21:35
>>364
ruby坊は去れ
ruby基地外に「Perlについての質問箱」が潰されたよ。
ひどいもんだ。見てきてみ。
ぷっ
くやしいか?ああ?
369デフォルトの名無しさん:02/10/03 21:53
お前の居場所はあのPerlスレしかなかったんだな。
可哀想な367
はやく自殺するなりなんなりしてくれ。
370Default:02/10/03 21:57
C言語でキーボードの入力を、別の処理をしながら逐次受け付けるように
するにはどうすればいいのですか?


>>370
またその質問かよ。
それに環境書けって言われてただろ。
進歩のない奴はだめだ。
372デフォルトの名無しさん:02/10/03 22:08
>>370
別の処理をしながら時々キーボードの入力をチェックする
373Default:02/10/03 22:09
OSはLinuxで、コンパイラはgccです。
すみませんでした。
スレ立てるまでも無い・・・スレにも一応書いたのですが。
よろしくおねがいします。
374Default:02/10/03 22:11
>>372
キーボードの入力のチェックってどうやるんですか?
375デフォルトの名無しさん:02/10/03 22:29
>>373
GUI使ってるのか、使ってないのかも書くように。
使ってるのなら、そのライブラリもな。
376Default:02/10/03 23:03
たびたびすいません。
えーと、GUIを使ってて、Xlibを使ってます。
HPを調べてマウスの使い方は分かったのですが、キーボード
はわかりませんでした。
377:02/10/03 23:07
>376
そっか、わからなかったか。
、、、で?
378デフォルトの名無しさん:02/10/03 23:08
>>377
ruby坊氏ね
379:02/10/03 23:19
>377
確かに仕事で今はruby使ってるが。
唐突にそんなこと言われても
ムカツクよりも「
なんだこいつ??」
みたいな感じだな。
380:02/10/03 23:20
あ、自分を批判してもーたw
381デフォルトの名無しさん:02/10/03 23:20
>>376
Xlib キーボード
というキーワードをgoogleにかけたら
http://x68000.startshop.co.jp/~68user/xprogram/xlib-2.html
なんてものがでてきたが?

にしても、x68000とは。
>>376
Xlibならキーチェックする方法あるだろ。
それ使えばいいじゃん。
>>379, >>380
あの有名なruby基地外によく似てるがな。
GCCのソースファイル見てるんだが、厨の俺にはどうしてもわからん記述がある。
iovfsscanf.cの中に

extern u_long strtoul __P((const char*, char**, int));
extern long strtol __P((const char*, char**, int));

こんな宣言があるんだが、これってコンパイラ通るのか?
385Default:02/10/03 23:33
>>381
欲しかった情報にぴったりです。そのサイト。
そこにあるソースを参考にして、いろいろやってみたいと思います。
ありがとうございました。
386デフォルトの名無しさん:02/10/03 23:36
>>384
__Pって、何かのマクロ?
放送禁止マクロです
#ifdef 〜〜
#define _P(x) (x)
#else
#define _P(x) ()
#endif
とかやってんじゃないの?

●●●●●●●●恒例・「オセロさえ納期内に作れない=OO役立たず 」祭り●●●●●●●
http://pc3.2ch.net/test/read.cgi/tech/1032985885/l50
/|         |  |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ
  |         |  | ̄ ̄ ̄ /|                    ||
  |         |  |   / /|TTTTTT   TTTTTTTTTT||TTTTT
  |        /\ |  /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^
  |      /  / |// / /|
  |   /  / |_|/|/|/|/|
  |  /  /  |文|/ // /
  |/  /.  _.| ̄|/|/|/         Λ_Λ
/|\/  / /  |/ /           (___)
/|    / /  /ヽ            /〔 非OO 〕〕つ
  |   | ̄|  | |ヽ/l            `/二二ヽ
  |   |  |/| |__|/   Λ_Λ     / /(_)
  |   |/|  |/      ( ´∀`)   (_)    Λ_Λ
  |   |  |/      // /  ^ ̄]゚        (`   )


ANSI-Cなプロトタイプ宣言に対応していないオールドタイプなコンパイラの
ための対策かな
    ∧∧
   /⌒ヽ)
  [ 祭 _]
  三___|∪
  (/~∪
  三三
 三三
やっぱruby基地外が出没してるようだな。



gccなら、このマクロのことじゃねぇの?
stdio.h

#ifndef __P
#if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)
#define __P(args) args
#else
#define __P(args) ()
#endif
#endif /*!__P*/
>>387 ワラ
395age:02/10/04 02:07
mainなんかなくてもいいじゃん!
>>395
そりゃそうだ。スタートアップスクリプトを書き換えて好きな関数から呼び出そう!
mallocでメモリ確保したいんですが、
mallocで確保できる容量の制限とか、
デカイ容量確保すると危険とかってあるんでしょうか?
そういうことは自分の処理系に訊いてくれ。
DOSなら、普通mallocで64KB以上のメモリは確保できないし
それ以下でも失敗することがある。
>>397
失敗したらNULLが返るだけだからきちんと戻り値をチェックすれば問題ないと思うけど。
400デフォルトの名無しさん:02/10/04 05:09
400get
すいません・・・マクロってどんな意味ですか?
おっきい
>>401
プリプロセッサのdefineディレクティブで定義されるもののことをマクロというようだ。
正式な言葉なのかただの慣習なのかはしらんが。
404401:02/10/04 05:22
レスさんくすー
>>399
malloc() したときに, 確保できたものとして NULL を返さないような
環境もみたいだけど(自分では試してない), そういう環境では
もっと他の対策を取らないといけないのかも.
>>405
ハア?
>>405
ヲイヲイ、そんな危険な仕様のmalloc()なんか使い物にならないぞ。
捨ててしまえ。
>>407
Linuxなんかそうだよ。

あまりに巨大なサイズを要求するとNULL返すけど、
小さい場合は触った瞬間にSEGVであぼーん。

よーするに、アドレス空間が使えることは保証するけど、
それに物理的な裏付けがあるという保証はない、と。
409405:02/10/04 14:11
いわゆる overcommit だと思う.
私なりの現状の理解では overcommit を認めるように実装された mmap(2) とか sbrk(2) で
実装された malloc(3) では, (もし malloc が確保した領域がちゃんと使えることを
保証するような実装になってなければ) malloc 時には NULL を返さないけど, その領域に
アクセスしたところで, 天罰が下る, ということで OK ?

私はこの辺の議論をする知識が欠けているから, みんなでこのスレなりの
議論をしてくれ.

ttp://search.luky.org/fol.2001/msg00337.html
ttp://home.jp.freebsd.org/cgi-bin/thread?mesid=%3c199910040604%2ePAA01232%40bluemoon%2eelec%2eryukoku%2eac%2ejp%3e
410デフォルトの名無しさん:02/10/04 14:18
>>408-409
冗談だろ?
それでは使えないじゃないか。
412デフォルトの名無しさん:02/10/04 14:28
>>409 のリンクより。
> Linux 2.2以降では、/proc/sys/vm/overcommit_memory に1を書き込むと
> overcommit動作をするようになりますが、デフォルトではovercommitしません。
ほう。知らなかった。
まぁ、そんなにでかいメモリ使うアプリ書いたこともないけど。
41388 - 66 = 11:02/10/04 14:58
誰も答えがわからなかったか? おまえら!!

モニターをひっくり返せアホ!


11 = 99 - 88


>>413
エラー:左辺値が必要
ははは、バカだなぁ。413も414も。

11をひっくり返したら、LLになるだろ。
LL=99-88
になるから、全く合法。
(変数宣言はねーねどな。)
    ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ( ´Д`)/< センセー、 ; がないので成立しません。 BASICでもやってろ!
 _ / /   /   \____________
\⊂ノ ̄ ̄ ̄ ̄\
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄||
>>413
手を使わずにモニターひっくり返すのは結構難しいですね。




自分が上下逆に見ればいいだけでは?
どっちにしろコンパイルできないが。
>416
335によれば、
>88 - 66 = 11
>式が成立しません!
である。「式」として成立するかはセミコロンによらない。
たとえば、if( LL = 99 - 88 )の括弧の中も「式」である。

ちなみにセミコロンが要るのは、式文。
>expression-statement:
>  expression(opt) ;
よしよし、あっちに積み木があるからあっちで遊ぼうね。
420416:02/10/04 18:27
>>418
この部分が式であっても、その式を含む文を
完成するためにはセミコロンが不可欠になる
(逆さでは無理)という意図で書いたんだが、

なるほど確かに335に「式として成立」と書いてあるんだな。
出所不明なので 413-415 しか読んでなかった。
421デフォルトの名無しさん:02/10/04 19:45
>>129
    ∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ( ´Д`)/< センセー、 ; がないので成立しません。 BASICでもやってろ!
 _ / /   /   \____________
\⊂ノ ̄ ̄ ̄ ̄\
 ||\        \
 ||\|| ̄ ̄ ̄ ̄ ̄||
 ||  || ̄ ̄ ̄ ̄ ̄||
↑C をはじめて知ってよっぽどうれしいんだな。
423デフォルトの名無しさん:02/10/04 20:14
#include <stdio.h>
main()
{
int a,b;
for(a=0;a<10;a++){
for(b=0;b<a;b++){
printf("*\n");
}
printf("\n");
}
ちゃんとできません。おしえてください
424デフォルトの名無しさん:02/10/04 20:17
>>423
最後の行に}をつけくわえる。

>>422
プ
425デフォルトの名無しさん:02/10/04 20:23
APIってなんすか?
スレ違い。
API=アピ=アップルパイの略。
428デフォルトの名無しさん:02/10/04 20:50
scanf系は初心者にはお勧めできない、とよく聞くのですが
代替法を教えてくらさい。

int i;
scanf("%d",&i);
printf("%d",i);

としたときに i に文字列を入れられると怖いんです。
>>428
int i;
char buf[30];

fget(buf,sizeof buf,stdin);
i=atoi(buf);
printf("%d",i);

エラーチェックしたかったらstrtolなりsscanfなりを。
430429:02/10/04 20:55
4行目はfgetじゃなくてfgets
聞けーーーー
じゃあ聞くけど、「未定義」「不定」 といったあいまいな部分
たとえば恒例の a=a++; などのやつな。
これらをきちんと動作定義しようという動きは無いのか?
それと、定義しないならしないで なぜWarningなりErrorなりを
コンパイルは吐かないんだ?

納得のいく説明しろ
a=a++; これは決まった処理するだろ
>>433
根拠は?
435デフォルトの名無しさん:02/10/04 23:58
人から貰った関数の引数に double *&a というのがあるのですが
これってどういう意味なんですか?
それってC++じゃないの
>>432
未定義や不定に関しては、プログラムをどう書き直しても解決しないわけで、
Warningを出すとうるさいからじゃない?。

>>433
有名なC FAQを見ればわかるよ
>>436
C++スレで聞いたほうがいいのでしょうか?
>>433
> a=a++; これは決まった処理するだろ

またこれかよ。いいかげん覚えろ、ヴァカ。

>>432

> それと、定義しないならしないで なぜWarningなりErrorなりを
> コンパイルは吐かないんだ?

厨房は、C なんか使うなってことだ。
>435
(double*) (&a)と読めばわかるかも
int a; int *p = &a;
*p = a++;

警告の出せる処理系を見てみたいもんだ。
>>440
なるほどー。thxです。
>>437
未定義や不定の処理を修正すれば解決するだろ。

>>439
>> それと、定義しないならしないで なぜWarningなりErrorなりを
>> コンパイルは吐かないんだ?

> 厨房は、C なんか使うなってことだ。

答えになってないな。脳味噌入ってるか?
>>443
この話題いいかげん飽きた。
未定義でも自分で大丈夫だと思えば使えばいいじゃん。
誰も止めない。勝手にしろ。
> 未定義でも自分で大丈夫だと思えば

自分の使う環境で動作が確認されれば

だろ。
>>443
441は読んだか?
ま  た  未  定  義  か
C99に対応したコンパイラってありますか?
age
>>444
自分が大丈夫だと思っていれば、他人が大丈夫じゃないと思っていても
使っていいのか? ずいぶんと勝手な奴だな。協調性が無いんじゃないか?

>>446
全部出せとは言ってないよ。
動作未定義なコードを、それと解ってて放置する理由って
なにかあるんだろうか…
>>451
引継ぎ。
文句があるなら使うな。もしくは自分で好みの言語を作れ。
454デフォルトの名無しさん:02/10/05 01:55
ビットフィールドで質問。

struct{
  unsigned char b1:1;
  unsigned int b2:1;
  unsigned long b3:1;
}BITS;

とかしたら、メモリイメージってどうなるんでつか?
あと、やっぱりBITS.b3はunsigned long型なんでつか?
よくわかんない。
なんか共用体と混同しているようだな。
>>453
C言語に限らず言語仕様に文句がないなんて、
良くわかってない初心者か、信者くらいなもんでしょう。
>>454 bit 数指定ね・・・
>>443
>> 厨房は、C なんか使うなってことだ。
> 答えになってないな。脳味噌入ってるか?

お前が、答えを読み取れないだけだろ ?
459デフォルトの名無しさん:02/10/05 04:05
scanf("%d",&a);rewind(stdin);
っていうのは
改行キーを吸収してくれますか?
試せばわかるんじゃあ・・・・
461デフォルトの名無しさん:02/10/05 04:19
その前に構造体のパディングが入る。
32bits マシン(int=long=32)と仮定すると、(□/■は1バイト)
■□□□ char (□はPADDING)
■■■■ int
■■■■ long
16bits マシン(int=16,long=32)と仮定すると、(□/■は1バイト)
■□■■ char, int
■■■■ long
となるだろう。
ビットフィールドは実装依存であり、(○/●は1ビット)
●○○○○○○○ かもしれないし、
○○○○○○○● かもしれない。
>>458
お前、文章読めるか? 答えになってないだろ。
答えが読み取れるというのなら言ってみろ。
どうせ、「お前には言ってもわからないよ」とか言い訳するのが関の山だろ。
463 :02/10/05 09:05
fpBin = fopen("binary.txt","wb");
if( fpBin != NULL ){
 fwrite(buf,1,strlen(buf),fpBin);
fclose(fpBin);
}

書きこんだファイルがバイナリモードなのに,テキストファイルを見たら,ちゃんと書かれているのはなぜでしょうか?
普通なら,人間には理解しにくい字がバイナリで書かれているはずなんですが
464デフォルトの名無しさん:02/10/05 09:18
>>462
おまえが答えを読み取れてないだけだろ。
日本語がよめねーの?
アフォにはここにきてほしくねーな。
日本語学校でもいってろ!!
>>463
バイナリモートとテキストモードの違いを調べてみれ
466デフォルトの名無しさん:02/10/05 09:29
>>465
おまえが調べろ!
>>464
やはり、言い訳するのがやっとか(w
これ以上やっても無駄だから放置するにかぎるな。
468デフォルトの名無しさん:02/10/05 09:49
厨房は何を使えばいいの?
469デフォルトの名無しさん:02/10/05 10:01
>>467
やはり日本語が理解できないのか(w
これ以上やっても無駄だから無視するにかぎるな。
470デフォルトの名無しさん:02/10/05 10:35
#include <stdio.h>
main()
{
  int *p,i=10;
  p=&i;
  printf("%d\n",*p);
  return 0;
}
4行目と6行目は*付いてる。5行目に*が付かないのはなぜですか?
>>470
p 指し示す先(iのアドレス)
*p 指し示す先の値(iの値)
>>463
バイナリモードとテキストモードは改行文字の扱いに違いがあるだけでそ。
というか"\n"が0x0Aなのがバイナリモード
"\n"がUNIXだと0x0A,DOSだと0x0D0x0Aになるのがテキストモードでそ。
473470:02/10/05 10:49
>>471
わかるようなわからんような・・
宣言してないものを使って変な感じがするのですが
>>473
int *p;はint型へのポインタの宣言。
p=&i;はpにiのアドレスを入れる。
printfの行の*pはpに入っているもの(iのアドレス)が指すものを参照する。
475474:02/10/05 10:53
訂正
×int *p;はint型へのポインタの宣言。
○int *p;はint型へのポインタpの定義。
ポインタの定義と間接参照が同じ形だからいけないんだろうな・・・
477470:02/10/05 11:02
>>474>>475
このプログラムは使い方わかりました。ありがとう

参考書見てるとこれより全然複雑だ・・・・・
478439:02/10/05 12:19
>>462
> >>458
> お前、文章読めるか? 答えになってないだろ。
> 答えが読み取れるというのなら言ってみろ。

元々 C 言語は、高級アセンブラみたいな発想で作られてるから、「コンパイルしたコードがわからん奴は使うな」と言うことだ。
その昔は、int とポインタを相互にがんがん代入し合っても文句一つ言われなかった事ぐらい知ってるか ?
まあ、最近はアセンブラも読めない奴が C/C++ なんかを使うようになったから、いろんな警告を出すようになったけどね。
未定義の場合に警告を出せと言うのはいいけど、>>441 のようにできないケースがある。できるものだけやれと言う思想はわかるけど、できないなら全てやらないという思想もある。
大方の C の処理系製作者は「ウザイ警告出すぐらいなら、プログラマの裁量に任せた方がいいな」と考えて後者を採用してるんだろな。

それが嫌なら、自分で作れよ。コンパイラじゃなくても、lint みたいな奴でもいいんだからさ。

> どうせ、「お前には言ってもわからないよ」とか言い訳するのが関の山だろ。

そんなことは言わんけど、上に書いたことぐらい理解できない厨房は C なんか使わないほうが身のためだよ。
HANDLE hf = CreateFile("test.dat",GENERIC_READ,0,NULL,OPEN_ALWAYS,0,NULL);

if(hf != INVALID_HANDLE_VALUE){
char buf[256];
DWORD read;
printf("オープン成功\n");
ReadFile(hf,buf,sizeof(buf),&read,NULL);
buf[read]='\0'; //バイナリモードでは,改行コードがないから?
printf("buf=%s",buf);
CloseHandle(hf);
}

buf[read]='\0';は何をしているんでしょうか?
HANDLE hf = CreateFile("test.dat",GENERIC_READ,0,NULL,OPEN_ALWAYS,0,NULL);

if(hf != INVALID_HANDLE_VALUE){
  char buf[256];
  DWORD read;
  printf("オープン成功\n");
  ReadFile(hf,buf,sizeof(buf),&read,NULL);
  buf[read]='\0'; //バイナリモードでは,改行コードがないから?
  printf("buf=%s",buf);
  CloseHandle(hf);
}

buf[read]='\0';は何をしているんでしょうか?
ファイルの中身を文字列とみなし、ASCIIZ文字列にしてるんでしょう。

ところで
> ReadFile(hf,buf,sizeof(buf),&read,NULL);
の第三引数は sizeof(buf)-1 にしないとまずいですね。
>>478
プログラマの裁量に任せるというのならWarningなんてすべて出さなければ良い。
警告がウザイなら、ワーニングレベルを下げればいいだけの話だろ。
だいたい、未定義の動作のコードをプログラマの裁量にあわせてどうなるって言うんだ。
書いた奴の力量がわかる以外なんの意味も無いだろ。
解りました。まとめましょう。

未定義や不定はCの『美徳』

これでよろしいかな?
>>482
で、おまえは誰にどうしてほしいわけよ。
ここでわめいてたって何も変わらんぞ。
Cなんか止めて、みんなJAVA使え、ってことじゃーねーの。
なーんだ。じゃあスレ違いだから放置だな。
>>484
別にここでどうしてほしいとも思わないよ。何かしてほしいならしかるべきところに言う。
ただ「未定義や不定でWarningやErrorにならない納得できる理由は無い。」という結論にしたいだけだ。
>>483は『美徳』という言葉が引っかかるが、それ以外に理由は無いという点で納得できる。
「仕様です」
>>488
warningにしてはいけない仕様は無いだろ。
ワーニング
仕様なんだからしようがない。
>>487
このスレでそういう結論が出れば納得かー。
生粋の2ちゃんねらだな。
>>481
日系ソフトウェアのサンプルプログラムなのだが・・・
-1するのは,最後の配列の次に代入しないため?
(255に\0を入れるため?)
>>492
しかたないだろ。他に納得のいく理由を言えないのだから。
仕様なんだから仕様が無いと書きたかったと思われ・・・
> 日系ソフトウェアのサンプルプログラムなのだが・・・

日経系の記事を間に受けちゃダメ(T_T)

>-1するのは,最後の配列の次に代入しないため?
> (255に\0を入れるため?)

ビンゴ。データが256バイト以上あると、readは256になる。
んで buffer[read]=0 とやるとバッファオーバーランだね。
>>456に反論しようかとも思ったがウザいんでやっぱやめた。
>>487
> ただ「未定義や不定でWarningやErrorにならない納得できる理由は無い。」という結論にしたいだけだ。

未定義で警告やエラーになるケースはいくらでもある。(もちろん処理系依存だけど、例として return 文のない関数 (void 型は除くよ) の戻り値とか)

要は、a = a++; なんて言うコードを見つける労力とそれに見合う利益を見比べて、多くの処理系では警告やエラーにしなくていいと思ってるだけだよ。別に規格で決まっているわけじゃないし、嫌なら...

> それが嫌なら、自分で作れよ。コンパイラじゃなくても、lint みたいな奴でもいいんだからさ。

と言うだけのことなんだよ。まあ、こいつは...

> 別にここでどうしてほしいとも思わないよ。何かしてほしいならしかるべきところに言う。

とわめくことしかできない DQN みたいだから、何言っても無駄みたいだけどね。(しかるべきとこってどこだよ、言ってみな。ププッ。)
Cの文句を言ってここの人たちに同意してもらいたい、ただそれだけのことだろう。
それで納得してぐだぐだ言わなくなるのなら快く同意してあげようじゃないか。
うむ。
                               ≡≡≡( ・ω・)ノ500
みんなくだらないことをうだうだ続けてるなぁ。
未定義で警告にならない例ってのはコンパイラを作っているところの趣味(たまに技術不足?)ってだけだろ。
最初(>>432か?)から、ただの趣味。特に警告にならない理由なんて無いって答えればよかったんだよ。
>>432も馬鹿だけど煽りだけで的確な返答が出来ない奴も馬鹿だね。
502 :02/10/05 17:15
>>496
親切にありがとん
501は自分の回答も馬鹿であることに気づいてるのか...
>>503
し〜〜〜っ、それいっちゃダメ。>>501 は、今満足感でいっぱいなんだから。いらんこと言うとまた暴れだすかもしれないしね。
>>503 >>504
し〜〜〜




























煽るだけならだまっとれ。
改行迷惑だって
a++だけの単文以外は全て警告を出すとか
ダメ?
>>507
ダメ。

char *strcpy(const char *d, char *s)
{
char *s1 = s;
 while((*d++ = *s1++) != '\0')
  ;
 return s;
}

とかで警告でまくる。

まずは...

・同一式中で同一変数に対して書き込みが2回以上あるケース
・同一式中で同一変数に対して読み込みと書き込みが1回以上あるケース
・代入文で、同一変数に対して両辺で書き込みを行っているケース

は警告するとかじゃだめかなぁ。
>>480
改行コードじゃないよ。0は文字列終端。
agetoke
511デフォルトの名無しさん:02/10/05 19:59
printf以外の出力のほうほうありますか?
puts,put_
513デフォルトの名無しさん:02/10/05 20:18
fprintf
_write
ビデオメモリに直接描画してこそ漢
516432=馬鹿:02/10/06 00:01
つーか、a=a++とかって、「Cの仕様」 じゃあ未定義だけど
「コンパイラの仕様」 だとバッチリ定義されてるんだよねー
ってのが言いたかった。 なんてね。

いやマジでコンパイラで弾いてほしいよな。
マジでエラーやワーニングにしない理由が和姦ねーよ
死ぬほどデバイス依存
>>516
> マジでエラーやワーニングにしない理由が和姦ねーよ

>>498
> 要は、a = a++; なんて言うコードを見つける労力とそれに見合う利益を見比べて、多くの処理系では警告やエラーにしなくていいと思ってるだけだよ。

これでもダメか ?

>>517
デバイス ? コンパイラ依存だろ ?
>>515
ネットワークサーバなのでビデオメモリなぞ持っていない罠。
コンソールもシリアルコンソールだったりして。
>>516
ANSI の「未定義」ってのはそういう事です。つか RTFM だ莫迦。
>>518
517 は 516 に割り込まれました
どうでもいいんですが
a = a++;
こんな文を書く人が実際にいるんですか?
>>522
未定義です
524デフォルトの名無しさん:02/10/06 03:20
>>518
ダメだ。
if(a=b) に警告出すくせによー
怠慢だ。
ところでさ、
ゴラァ、言いかけて途中でやめんな!で、何だってんだ!
>>524
if(a=b) の検出はすごく簡単だぞ。
528デフォルトの名無しさん:02/10/06 10:08
LinuxでBMP画像を読み込んで表示して、
その画像の中から目的の色(オレンジ)を探し出すプログラムを作りたいんですが
よく分からないんです・・・
今までに関数やポインタ、ファイルの入出力くらいしか学んだことが無くて・・・
位置からご教授願えないでしょうか?
よろしくお願いしますm(_ _)m

>>527
> if(a=b) の検出はすごく簡単だぞ。

それにいっぱい奴やるいるからな。

>>524 も、気に入らないなら自分で作ればいいんだよ。
>それにいっぱい奴やるいからな。

+ 激しく意味不明 +
531529:02/10/06 10:27
>>529
> それにいっぱい奴やるいるからな。

ちょっと変だな。

「それにやる奴いっぱいいるからな。」

に修正だ。
>>531
>ちょっと変だな。
ご謙遜を、、
すごく変ですよ。
>>529>>532
おまいら激しく面白い
534デフォルトの名無しさん:02/10/06 11:37
これって、違法なコードなの?
コンパイラに「 LValue じゃない!」って怒られたんだけど・・・

void f(int *a, int *b, int c, int d)
{
int i;

for(i=0;i<10;i++) *((c<d)?a:b)++=1;
}
>>534
C++であれば合法
>>534
頭大丈夫か ?

int a;
a++ = 1;

とやってんのと一緒だぞ。
537534:02/10/06 11:49
>>536
へ?どして?
538536:02/10/06 12:05
>>537
> へ?どして?

ごめん、頭大丈夫じゃないのは俺だ。* と ++ の結合順序勘違いしてた。

>>534
>>535 が言うように、C だとダメで、C++ だと OK。
for(i=0;i<10;i++) (c<d)?*a++=1;:*b++=1;
じゃだめなの?
540534:02/10/06 12:06
>>535
>>538
へ?どして?
541534:02/10/06 12:09
>>539
いや、別にそれに相当するコードの書き方が
分からない訳じゃなくて、
一見正当そうに見えるコードにコンパイラが
ケチをつけた事にびっくりしただけの話
542539:02/10/06 12:10
って、ゆうかー
何でループのなかで比較繰り返しているの???
効率悪くなーい??
543539:02/10/06 12:11
そういう意味ね。542先走ってて恥ずかしいや
> 効率悪くなーい??

最適化かければ比較は外でやると思う
545536:02/10/06 12:17
>>539
> for(i=0;i<10;i++) (c<d)?*a++=1;:*b++=1;
> じゃだめなの?

そりゃダメだろ、文法エラーだ。(';' が余分だよ。)

>>540
C は、条件演算子の結果は、左辺値になれない。(GCC とかの、拡張機能でサポートしていた記憶がある。)

だから、

int a, b, c;
a ? b : c = 1;

なんて式は、C ではダメだけど、C++ では合法。
546534:02/10/06 12:32
>>545
じゃあ、こんなのも駄目なの?
(基本的に今回の例と大差が無い様な気がするけど)

void f(int a, int b, int c[])
{
c[ a < b ? 0 : 1 ] = 1;
}
547デフォルトの名無しさん:02/10/06 12:33
>>545
a?b:c=1;ってaが真ならbを返し、偽ならcに1を代入してそれを返すという式にならない?
a?b:(c=1);としないとだめ?
a?b:c=1;を-ansiオプションつけてgccでコンパイルしたら通ったよ。
549548:02/10/06 12:45
わるい、-pedanticオプションもつけたらだめだっていわれた。
550デフォルトの名無しさん:02/10/06 12:46
>>548
-pedantic 付けてみな。
>>547
> a?b:c=1;ってaが真ならbを返し、偽ならcに1を代入してそれを返すという式にならない?
ならない。代入より条件演算子の方が優先順位が上。

>>546
物凄く大差がある。>>534
「代入式の左辺の中で左辺値になれないものを使うこと」が
マズいのではなくて、「左辺値になれないもの( c<d?a:b )に
左辺値を要求する演算子( ++ )を適用していること」 が問題。
*( c ? a++ : b++ ) = ... なら問題なし。
>>546
> じゃあ、こんなのも駄目なの?
> void f(int a, int b, int c[])
> {
> c[ a < b ? 0 : 1 ] = 1;
> }

これは、大丈夫。( a < b ? 0 : 1 ) の部分は、左辺値じゃないから。
左辺値なのは、c[...] の部分だからね。

>>547
そう言うこと。
553デフォルトの名無しさん:02/10/06 13:04
a?b:c++; OK
(a?b:c)++; NG

正しい?
a?b=1:c;
?と:の間ならOKなのか。。。
>>528
GTKを使えば画像を読み込んで表示することができるんではないでしょか。
556534:02/10/06 13:17
>>552
もしかして今回の例でケチをつけられた所は
++ 演算子を使用している部分なの?

たとえば

*((c<d)?a:b)=1;

だったら問題が無かったのか?
>>556
> たとえば
> *((c<d)?a:b)=1;
> だったら問題が無かったのか?

そう言うこと。
558534:02/10/06 13:22
>>557
なるほど、勉強になりますた。
>555
えっとGTKをどのように使えばよいでしょうか・・・?
GTKはウィジェットをすこしつかったことがあるだけなんでよく分からないんです(汗;
560528:02/10/06 14:11
↑528です^^
561デフォルトの名無しさん:02/10/06 15:17
>>557
初心者をからかってたのしかったですか?
>>561
> 初心者をからかってたのしかったですか?

何を言いたいの ? 単なる煽りか ?
563557:02/10/06 15:38
>>561
初心者は適当にあしらっておけばいーんだよ
564デフォルトの名無しさん:02/10/06 15:41
>>563
2ちゃんねらは性格歪んでるな(藁
>>561
話の内容が自分には理解できなくて悔しかったですか?
きみたち、たぶん、西友で買った霜降りジーパン履いてますね?
今パンツ一丁だが、何か?
俺は一応シャツも着てます
俺は一応ブラだけ着けてます。
>>569
> 俺は一応ブラだけ着けてます。

パンティーは ?
おれはちんぽに女をつけてます。
漏れはケツの穴に男がささってます
573デフォルトの名無しさん:02/10/06 20:47
すみません、あるバイトの中の、特定のビットをOFFにする方法を知りたいのですが
どなたかご存知ないですか?
ビット演算かましてください
x &= ~(1<<bit);
576573:02/10/06 20:58
>>574-575
ありがとうございます。おかげで問題が解決しました。
短い間にお答えいただきありがとうございました。
577デフォルトの名無しさん:02/10/06 21:25
すみません、longで宣言した変数の特定のビットをONNにする方法を知りたいのですが
なにかいい関数はありませんか?
int n=123;
char ss[256];

sprintf(ss,"%3d",n);

ss[0]=1;
ss[1]=2;
ss[2]=3;
ss[3]=?;

ssの配列に入っている数字は,あってます?
文字列としては入っているんでしょうか?

int num=ss[0];
などはだめなんでしょうか?
>>577
>>575を見て思いつかんのか…

x |= (1L << bit);
>>578
何をしたいのかわからん。

まず、
ss[3]には'\0'が入ってる。

次に、
int num=ss[0];
をやっても構わんが、たぶん君の思ってる値とは違うものが入っているだろう。
>>578
> ssの配列に入っている数字は,あってます?

合ってない。
あんたの環境がわからないから答えようがないけど、多分...
ss[0] = 49; ss[1] = 50; ss[2] = 51; ss[3] = 0;
になってると思う。

> 文字列としては入っているんでしょうか?

そう言うこと。

> int num=ss[0];
> などはだめなんでしょうか?

何を期待しているのかは知らないけど、num = 1 になることを期待してるならダメ。
>>579
>>577 は、ネタだと思うが...。第一、ONN って何だよ ?
>>582
ぐぐれ、話はそれからだ
>>581

nt num=atoi(ss[0)]

もあかんですよね?;
そんなもんまずコンパイルが通らん
>>584
> nt num=atoi(ss[0)]

一行中に、三つ以上間違いがある投稿は、ネタとみなす。
587582:02/10/06 22:48
>>583
なかなか、おもろい。>> ONN
>>586
3つ…?
ぷっ、指摘されて気付いた。笑いますた。
589デフォルトの名無しさん:02/10/06 22:53
文字列を返すDLLを作ったんですが、
リターンの後に動的に確保したメモリを解放するにはどうすれば良いんでしょうか
int num=atoi(ss[0)]);

もあかんですよね?
なんか最近ネタばっかだな
>>590
ネタでなければ一回コンパイルしてから、
書き込んだほうがいい。
593デフォルトの名無しさん:02/10/06 23:28
ANSI Cのqsortで、swap作業はどうやってるんですか?
for (p = (char *) v, end = (char *) v + nmemb*size; p < end; p += size)
  ...
こういうループで調べていくのは分かったんですが。。。
594デフォルトの名無しさん:02/10/06 23:29
何をえらそーに
>>589
メモリを確保して返す関数なら解放用の関数も作れ
>>593
buf = malloc(size);
  :
memcpy(buf, p1, size);
memcpy(p1, p2, size);
memcpy(p2, buf, size);
  :
free(buf);

て感じじゃないの。swapするときにいちいちmalloc、freeしてたら遅くなるから、
qsort呼ばれたときにbufを確保して使いまわして、終わったときにfreeだろうな。
他に方法あるかな。
つーか激しく外出。
このスレの >>16から読め。
598589:02/10/07 00:55
これでいいですか?


const char *buffer;

BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD ul_reason_for_call, LPVOID pParam)
{
  switch (ul_reason_for_call) {
  case DLL_PROCESS_ATTACH:
    buffer=malloc(16);
    break;

   case DLL_PROCESS_DETACH:
    free(buffer);
    break;
  }
   return TRUE;
}

__declspec(dllexport) const char *WINAPI res_c(){
    strcpy(buffer,"てすと");
    return(buffer);
}
599589:02/10/07 00:57
>>598
あと追加質問で、DllMain()の
 buffer=malloc(16);
を res_c()で行うのはOKですか?
>>598
うむむ。windowsに詳しくないのだが、それ、リエントラントじゃないのでは。
共有ライブラリでリエントラントでないのはまずいんじゃないの。
ポインタbufferは、プロセス別に取られるはずだから、別にいいんでわ?
Threadとか、ライブラリにグローバル変数使う事については知らない。
602600:02/10/07 01:17
>>601
あ、そうなんですか。失礼しました。

ただ、マルチスレッドでは問題が起きそうだね。
res_cを呼んだスレッドがあって、返ってきた物を使う前に
別のスレッドがres_cを呼んじゃって書き換えられるという
ことは十分ありうる。
char c[80];

sizeof(c)

って可能なんですか?
どういう動作をしているんでしょうか?
sizeof(char) * 80 になるYO!
>>602
仮に文字列の書き換えがres_c内だけでしか行われて
いないなら、別スレッドで書き換えられても問題なし。

しかし、それ以前に >>598のやっていることは
あまり意味がないというか、一体何がやりたいんだ?

>  buffer=malloc(16);
> を res_c()で行うのはOKですか?
これをやるならわかるけど。
>>604
つまり80ね
607デフォルトの名無しさん:02/10/07 01:47
テキストファイルの一行目だけを読み込んでSというAnsiString変数に代入したいのだが・・・
608 :02/10/07 01:50
>>604

sizeof(char)*80

と毎回やっていた俺はあほですか?

自動で文字列数(配列数)を調べてくれるって事?
char型=1だからできる技なんですよね?
で、何?
>SというAnsiString変数
AnsiStringって型みたいだが、本当にCか?
>>608
>char型=1だからできる技なんですよね?
んなこたーない
612607:02/10/07 01:53
C++でした。Stringに代入したいんです。
>>608
int a[80]; なら sizeof(a) は sizeof(int)*80 になるよ。

> と毎回やっていた俺はあほですか?

80を #define しているなら別にいいんでないかな
たとえば
 char c[80]; を
 char* c = malloc(80);
に書き換えたときのために。
>>612
String?C#か?
>>607
C++Builderですか?

AnsiStringに>>を適用すると、改行文字も含めてファイルの中身を
全部読んでしまいますからねえ。

私はchar[]に一度読み込んで、S(buf)などのコンストラクタを呼び出して
いますがスマートじゃないですね・・・・・
■ VisualC++(MFC限定)相談室 5■
http://pc3.2ch.net/test/read.cgi/tech/1028553308/
>>607
std::stringなら、getline(strm, str); という形式が使える。
618616:02/10/07 01:57
ごめん。607しか見てなかった。
>>616は間違いです
619607:02/10/07 02:00
>>615
えぇ、C++Builderです。
TStringListで読み込むと、一行だけ必要なのに時間がかかると思うし・・・
簡単に言うと、Delphiの
var
F: TextFile;
S: String;
begin
AssignFile(F);
Reset(F);
Readln(F, S);
CloseFile(F);
を、C++でできないかな
>>619
delphi知らんけど。
gets()じゃいかんの?
>>619
AnsiStringにはpush_back()がないから、back_inserterも使えんしな。
getlineも使えない。

std::string str;
S = "";
getline(ifs, str); //もしくはホワイトスペースで区切られてもよいなら ifs >> str;
S.printf("%s", str);

とやって、一度std::stringに読み込んだ文字列をAnsiStringにコピーしてはどうか。
622Default:02/10/07 02:29
Xlibで、

57: XLookupString((XKeyEvent *)&event,string,sizeof(string),&key,NULL);
58: if ( string[0] == 'q' ){
59: goto FINISH;
60: }

のようにして文字キーの押されたのは取得できたのですが、文字キー以外のキー
の取得しかたがわかりません。どうやればいいんですか?
矢印キーを取得したいです。
>>619
もう一度分かりやすく書きます。

std::ifstream(F, "text.txt");
std::string str;
AnsiString S;
std::getline(F, str);
S.printf("%s", str); // std::stringをAnsiStringにコピーする
F.close();
やっぱりこの方がいいかな。

std::ifstream(F, "text.txt");
std::string str;
AnsiString S;
std::getline(F, str);
S.printf("%s", str.c_str()); // std::stringをAnsiStringにコピーする
F.close();

"%s"に対してstd::stringを適用した時はoperator*が呼ばれるわけで
すが、これがCスタイルの文字列を返すことは保証されてないわけで、
c_str()メンバ関数を適用すればいいかと。
>>624
AnsiStringって知らないんだけど、
AnsiString S(str.c_str());
って出来ないの?
>>625
できるようです。
コピーはprintf、初期化にはコンストラクタと使い分ければいいかな。
>>626
まともな文字列くらすなら、
operator=(const AnsiString&)/operator=(const char *)くらいは
用意されてると思うのだが・・・

つーか、ここCすれだよな。
628デフォルトの名無しさん:02/10/07 06:28
本を読んでいたら、こんなのを見かけました。
(void *(*)(void *))func <-- funcは関数

なんで(void *)funcだけじゃだめなんですか?
(void *)func は、関数funcのアドレスを
void*にキャストする式。

(void *(*)(void *))funcは、funcのアドレスを
void*をとり、void*を返す関数ポインタにキャストする式。

型が違う。
>>628
関数へのポインタへのキャスト。
631600:02/10/07 08:10
>>628
その例における、funcに代入できる関数のプロトタイプは

void *f(void *);

だ。
>>631
がーん、変なのが残ってた。
キャストか。キャストだよな。代入はできないよな…
>>596
mallocしなくても出来るだろ。

void memswap(char *p1, char *p2, size_t len)
{
 while (len-- > 0) {
  char t = *p1;
  *p1++ = *p2;
  *p2++ = t;
 }
}
>>633
外出。
>>633
遅いコードだなおい・・・
>622
XLookupString 後に key に入っている KeySym を使いましょう。
637596:02/10/07 18:37
>>635
ま、3回もmemcpy呼ぶのとどっちが遅いかはなんとも言えんが(w
というか、>>36でも言ったけどqsortは失敗が許されないからmallocは使えない。


なんでqsortの要素の交換方法なんてマイナーな話題が二度も同じスレででるんだろう。
639 :02/10/07 22:47
int num[NUM_SIZE];

&numとnumが同じなの?

numは,配列の先頭アドレスですよね
&numは・・・?
&は,アドレスを指すから・・・?
ageてないからネタ確定ってことでよろしいか?
ネタじゃないんなら>>1のリンク読め
641 :02/10/08 00:28
int num[NUM_SIZE];

&numとnumが同じなの?

numは,配列の先頭アドレスですよね
&numは・・・?
&は,アドレスを指すから・・・?
642 :02/10/08 00:32
ネタ=sageはいかがなものか
>>641
まず
>&numとnumが同じなの?
なんでこんなふうに思っちゃったのかが問題だ
644D級初心さ:02/10/08 00:44
641さんの書き込み見て

#include <stdio.h>
#include <conio.h>

int main()
{
int num[]={1,2,3};
printf("%d %d %d %d",num, &num, *(&num), **(&num));
getch();
return 0;
}

ってやったんですけど、結果が
688760 688760 688760 1

ってなりました。どうして、numと&numがおんなしなんですか?
構文豆腐
&num は配列のアドレスを表す
num は配列そのものを表すが配列の先頭要素のアドレスへの暗黙の変換がある

しかしポインタを%dで受け取るのは止めようぜ
   λ...............    。るくてっ逝だ当本
>>646
*(num+1)=5;
と、使えますもんね。
>>649
これが初代?
しかしこの痛い1でよくこれだけ長寿のスレができたもんだな・・・
>>649
このスレの「俺」ってそこの1だったんだね。目から鱗が落ちました。
652デフォルトの名無しさん:02/10/08 01:34
みなさん 迷える子羊に合いの手を(シャンシヤン!)

私は、ソースの書き方に ほんの少々のこだわりを持ってCのプログラミング
をしています。でも同僚に言わせると「その書き方は邪道」と言われて
今悩んでいます。みなさんの意見を聞かせてください。


{は、その行の末尾に付ける
   if(a==b){
      c=d;
      e=f;
   }
理由 {を単独で1行にすると、1画面で見えるコードの行数が少なく
   見にくい。と思う。
   
   
   
一部が異なるだけで、同じ内容が構文が連続するときは、1行中でも
複数の命令可
   if(a==1){ printf("NEC\r");   c=sub(1); }
   if(a==2){ printf("FUJITSU\r"); c=sub(2); }
   if(a==5){ printf("IBM\r");   c=sub(5); }
   if(a==6){ printf("DELL\r");   c=sub(6); }
   if(a==8){ printf("COMPAQ\r"); c=sub(8); }
   if(a==9){ printf("APPLE\r");  c=sub(9); }
理由 COPY&Pasteで複写して、必要な部分のみ変更すれば早く書ける
   ぱっと見に、何をしているのかがわかりやすい。
   1行には1命令で書くと、リストが長くなり、見にくい、と思う。

どんなもんでしょうか。
>>652
{は}とそろえたほうがどこからどこまでが対応するブロックかわかりやすいでしゅ
行末につけるとアンチK&Rにキモがられましゅ

if ( a==1 ) printf( "NEC\r" ), c=sub(1);

とかできるかもしれましぇん
俺もそう書いてる
特にクレームつけられたことはないね
655 :02/10/08 01:48
>>652
> {は、その行の末尾に付ける

センスと好みの問題なのでどうでもいい。

> 一部が異なるだけで、同じ内容が構文が連続するときは、1行中でも
> 複数の命令可

同じような内容が3箇所以上出てくることに疑問を持たないのは
どうかと思う。
   if(a==1){ printf("NEC\r");   c=sub(1); }

はBASIC臭がするからイヤだ。
結論。
コーディングスタイルを語るのもいいが、
その前にコードの設計を見直した方がいい。
漏れの場合、ローカル変数漏れを防ぐブロック化を多用するんで
if (a == b)
{
 do something;
}

if (a == b) do something;
{
 other things;
}
の区別がしにくいので、特に制御構文の場合は
if (a == b) {
 do something;
}
にしてる

逆に関数の宣言とか、実行文中に現れないヤツは
void func_hoge(int arg)
{
 do something;
}
にしてる

こっちのほうがよっぽど汚い(藁)
俺はこう書く
for(〜){
  for(〜){
〜〜〜〜
} }
やっぱダメ?
りすぱーが、コードの最後を
  )))))))))))
とかで終えるのを思い出した。
>>660
LispじゃないC系言語で
}}}}}
ってのを見た時には憤死するかと思った
662デフォルトの名無しさん:02/10/08 05:46
>>659
やめてほしい(^_^;)
663デフォルトの名無しさん:02/10/08 06:03
ランダムに発生させた0〜9までの整数を
DWORD型、例えば 0x007fffff の7の部分に入れたいのですが
どうすればいいのでしょうか?
例えばrandで3が出たら 0x003fffff にするといった具合です。
できれば0〜15まで整数を発生させて0〜fに置き換えたものを
7以外の部分にも入れられるといいのですが・・・
a = (a & ~(0x0f <<20)) | (rand_val <<20);
int r = rand() % 15;
DWORD v = 0xfffffUL | (r << 20);
printf( "result: %x\n", v);
>>663
いくつか解がある。DWORDの型がわからんが、
たぶんunsigned longのtypedefだろうと仮定する。

乱数の値はr(0 <= r < 10)とするよ。求める値をvに代入する。
まず無理やりな解から。

char buf[7];
sprintf(buf, "%dfffff", r);
v = strtoul(buf, NULL, 16);

これはやってることがアフォなんでやらないように(w
で、正当な答は

v = ((DWORD)r << 20) | 0xfffff;

他にもあるかな。

>できれば0〜15まで整数を発生させて0〜fに置き換えたものを
>7以外の部分にも入れられるといいのですが・・・

意味がよくわからない。0x00000000〜0x009fffffの乱数を
発生させたいという意味だろうか。だとすると0〜15の乱数を発生させる
やりかたがわかるのならできるんじゃないかな?
各桁にランダムな値を順に入れて行けば良い
桁数分繰り返せば出来る、と言うのが適当なのか?
シフトを1回に一桁づつすればとか
ヒントになるようなならないようなことも書いておく。
質問。
c == EOF のあと、もういちど c = fgetc(fp) とやった場合、
c == EOF になることは保証されますか?
はい
671うんっちっち坊や:02/10/08 13:31
ポインタって一体どんなときに使うのですか?
ポインタを知らずして、ゲームは今まで作ってきました。
特に問題なかったのですが、今資格のために正しいC言語を
勉強してるのですが、ポインタがいまいちわかりません。

どういうものなのか、どういうときにつかうのか。簡単におしえてください。
672うんっちっち坊や:02/10/08 13:36
えーっとたとえば
Aという数値データがあって
1つはAそのもの。もうひとつ*zは
A+5の値を毎回表示とかってときに使うんですかね?
言葉ヘタクソですけど。

*z=&A+5
A 1,2,3,4,5,6、・・
*z 6、7、8、9、10、11・・  みたいな。

でも
*zを使わないでも
Z=A+5
でも一緒だし、なんか数が変になっちゃう例ってないですか?
そういうときに使うんですよね?
>>671
FILE *fp;
fp = fopen(filename, "r");
とか
void f(int *ap) {

}

int a[10];
f(a);
とか
675nobodyさん:02/10/08 14:42
>>674
int a[10];
f(a);
って?ポインタ入ってないんですが
676デフォルトの名無しさん:02/10/08 14:45
画像処理ボードから取り込んだデータ(画素値,char型)をintに変換したい
のですが,atoiを使ってるのですが,うまくいきません.
なんか他に方法ありますか?

取り込むデータは
char data;
で定義しています.
677676:02/10/08 14:48
ボードから正しく取り込めていることは確認しています.
あと.atoiを使うと,"char"を "const char*"に出来ないとか出ます.
>>676
文字列で取り込んでいるの?
>>676,677
char data;
int idata;
idata = data;
>>675
> って?ポインタ入ってないんですが

関数の引数がポインタなんだと思うが。
681675:02/10/08 15:24
>>674
int a[10];
f(a);
ポインタ演算子入ってないんですがf(a)のaはポインタ
というのですか。

682675:02/10/08 15:26
>>680
ありがd。書き込みのタイミング悪かったっす。
683680:02/10/08 15:29
>>682
まずは >>1のリンクにある C FAQ を読んだ方がいい
>>672
以下のプログラムの???を埋め、
int型の数値を入れ替えるswap関数を作ってみろ
#include <stdio.h>
void swap( ???, ??? )
{
  ???
}

int main(void)
{
  int a = 10, b = 20;
  printf("a = %d, b = %d\n", a, b); /* a = 10, b = 20 */
  swap( ???, ??? );
  printf("a = %d, b = %d\n", a, b); /* a = 20, b = 10 */
  retrun 0;
}
int &a
int &b
*a^=*b^=*a^=*b;
&a
&b
686675:02/10/08 15:44
>>683 Thanks much. 激しく厨でスマソ
「配列とポインター」の章にございました。
http://www.catnet.ne.jp/kouno/c_faq/c4.html#8の質問に
; が落ちてました。>厨が何ぬかすか
>>685
ハズレ
> int &a
> int &b
int *a
int *b
ま た 未 定 義 か
689676:02/10/08 16:19
>678
1バイト文字です.データが8ビットなんで.
>679
試してみたらうまくいってるみたいです.ありがとうございます.
>>689
文字と文字列の違いがわかっちょらんな
>>690
違う。
文字と数値をわかっていない。
692663:02/10/08 19:45
>>664-668
ありがとうございます

>>667
例えば 0x7f3c90 は
7f → 音の強さ 00〜ff
3c → 音 3c=ド (3d=ド# 3e=レ 3f=レ# 40=ミ 41=ファ....)
9 → 1001(b) = 音を鳴らす (1000(b) = 音を止める)
0 → チャンネル番号
ということだそうです。(下のページより)
 ttp://hp.vector.co.jp/authors/VA007941/program/no2090.html

で、上のデータ 0x7f3c90 は音程が3cなわけですが
音程を3eや40などに変えたい場合、どうすればいいのでしょうか?
(ランダムの話しは忘れてください(汗)
(既にあるデータ(0x7f3c90でも良い??))*0x110011+0x000100*(0x3e)
で、出来ない?
#define ONTEI_HENKOU(a, b) \
  (((a) & ~0xff00UL) | (((b) & 0xff) << 8))

x = ONTEI_HENKOU(0x7f3c90, 0x3e);
あっ、そっかゴメン、16進数なのだからffだねw
&の方が適しているし手間かけて済まん。
>>692
汎用の関数作って使いまわしたほうがよくないか?
音程以外にも変えたいだろうし。

#define OFFSET_PITCH 8
#define OFFSET_VELOCITY 16
#define OFFSET_NOTE_ONOFF 4
DWORD set_byte(DWORD data, unsigned char value, int offset) {
 return (data & ~(0xff << offset)) | (value << offset);
}
DWORD set_nibble(DWORD data, unsigned char value, int offset) {
 return (data & ~(0xf << offset)) | (value << offset);
}
DWORD set_pitch(DWORD data, unsigned char pitch) { // 音程を変える
 return set_byte(data, pitch, OFFSET_PITCH)
}
DWORD set_velocity(data, unsigned char velocity) { // 強さを変える
 return set_byte(data, velocity, OFFSET_VELOCITY);
}
DWORD set_note_on(data) { // 音を鳴らす
 return set_nibble(data, 0x9, OFFSET_NOTE_ONOFF)
}
DWORD set_note_off(data) { // 音を止める
 return set_nibble(data, 0x8, OFFSET_NOTE_ONOFF)
}
みたいな感じで。チャンネルを指定するやり方は自分で考えてくれ。
行数多すぎだバカ、と文句言われたので詰めるのに苦労した(w
Cの質問です!

(1)次の4つの記号 ┏ ┓┗ ┛を用いて4角を出力する rect() 関数を作成しましょう. ? 出力例 ┏┓ ? ┗┛
(2)さらに┃を利用して, 4角の縦のサイズを変えられるように rect() 関数を変更しましょう.
 Hint. rect(int n) というように引数 n を取って, n の数だけ ┃┃ を出力します.

だれかこの問題を解いてください!
>>697
×:Cの質問です!
○:Cの宿題です!
よってスレ違い

宿題手伝いますYO!!
http://pc3.2ch.net/test/read.cgi/tech/1029422194
>>697
どういうふうにやればいいと思う? というか君、Cを学ぶ気ある?
あるんなら、ヒントだけにしとくし、全くないのなら、答え書いちゃうけど。
700699:02/10/08 21:06
>>698
あ、そうか、ここ宿題スレじゃなかった。すんませんですた。
701デフォルトの名無しさん:02/10/08 21:06
ヒントでお願いします!
ヒント
・もっと自分の頭で考えましょう
>>700
他のスレにも書き込んでおいて知らなかったはないだろ。
>>699
2chにあるまじきレスですな。
705699:02/10/08 21:12
>>703
いや、おれは>>698じゃないんだが…
>>705 すまん。まちがいた。
707697:02/10/08 21:15
(1)#include <stdio.h>
main() {
printf("┏┓\n");

printf("┗┛");
}

はこれで表示されることがわかったのですが、(2)がわかりません。
ヒントだけでいいのでお願いします!
708デフォルトの名無しさん:02/10/08 21:16
>>705
 >>697だろ
もうグダグダだな。
>>707
rect関数じゃないじゃん
711699:02/10/08 21:18
>>708
そ、そうですた。ウワァァァ
713697:02/10/08 21:20
すみません。宿題の方で聞けといわれていたもんで・・・
悪気はなかったんです。
714デフォルトの名無しさん:02/10/08 21:21
>>707
> ヒントだけでいいのでお願いします!

[重要ヒント]
forを使う。
#include<stdio.h>
int main(void){
int i,hoge;scanf("%d",&hoge);printf("┏┓\n");
for(i=0;i<hoge;i++){printf("┃┃\n");}
printf("┗┛\n");return 0;}
/*この変数hogeの数値を変更することによって┃┃の長さは変わる*/
>>707 ヒント:10回までは表示できる
void rect(int n) {
  printf("┏┓\n");
  swich(n) {
  case 10:printf("┃┃\n");
  case 9:printf("┃┃\n");
  case 8:printf("┃┃\n");
  case 7:printf("┃┃\n");
  case 6:printf("┃┃\n");
  case 5:printf("┃┃\n");
  case 4:printf("┃┃\n");
  case 3:printf("┃┃\n");
  case 2:printf("┃┃\n");
  case 1:printf("┃┃\n");
  }
  printf("┗┛\n");
}
つうか、わざわざ関数作ってやることなのか?
つーかお前ら優しすぎるぞ。
>>718
やっと俺が教えれる問題だったので。
枠がるな
721697:02/10/08 21:34
皆様、どうもありがとうございました!
感動しました。
これを応用していろいろ頑張ってみます。
>>721
ついでにマルチはしないように。
723697:02/10/08 21:35
>>722
OKです
724デフォルトの名無しさん:02/10/08 21:36
void rect( int n )
{
int i;
printf( "┏┓\n" );
for( i=0; i<n; i++ ) printf( "┃┃\n" );
printf( "┗┛\n" );
return;
}
725デフォルトの名無しさん:02/10/08 21:38
スペースキーを押したというのを読み取るにはどうすればいいですか?
int main(){
  printf("input n ");
  scanf("%d",&n);
  rect(n);
  return 0;
}
>>725
getcher()
>>725
if (スペースキーが押されたか) {
  押された。
}





OSによって違う
>>728
間違い

処理系によって違う
730デフォルトの名無しさん:02/10/08 21:44
>>725
>>370-
731デフォルトの名無しさん:02/10/08 21:45
732692:02/10/08 21:52
>>693-696
うおー ありがとうございます
道が開けますた!
733デフォルトの名無しさん:02/10/08 21:56
n[i]まとめられた各々の実数をまためて足す場合どうすればいいですか?
n[1]=1 n[2]=2 n[1]+n[2]=3みたいな感じで。。
734デフォルトの名無しさん:02/10/08 22:01
float sum=0.0;//float実数型(doubleでもよし)
for(i=0; i<n; i++)//n個のデータのときはこう
  sum+=n[i];
735733:02/10/08 22:02
734
ありがとうございました
736デフォルトの名無しさん:02/10/08 22:03
int ii:
int nn=0;

for(ii=0; ii<i; ii++ ){
  nn = n[ii];
}
737734:02/10/08 22:08
ごめん
n[],n一緒に使えないじゃん。直しといて。逝って来ます。
>>736
>>734から2分遅れの上に間違ってる
>   nn = n[ii];
nn += n[ii];
>>738
>>733 の「各々の実数を」と言うところは、直さなくていいのか ?
740_:02/10/08 22:16
<突然ですがここで問題です。>

和宛ゲームの作成!
仕様:ある任意の数(固定)をプレイヤーは当てます。任意の数字は1〜100
 答えられる回数は10回。プレイヤーは答えるたびにあとチャンスはn回
 です。との情報を受ける。
 外れた場合は入力した数字が任意の数字より大きいか小さいか知らせる。
 10回のチャンスがなくなるまでつづく。

    以上
>>740
課題丸投げするなボケ!
> <突然ですがここで問題です。>

こんな切り出し方するヤシは放置。何様だ?
「和宛ゲーム」の読みを当てるのが問題ですか?
744デフォルトの名無しさん:02/10/08 22:46
つーか普通に宿題スレ逝け。
それって、ゲームとして成立するの?
絶対、解けるじゃん。
>>745
確かにそうだな。まあいいよ。ネタは放置。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main() { int r, input, count = 10; srand( time(NULL) ); r = rand()%100; do{
printf("アト%dカイ\n",count); scanf("%d", &input); if( r == input ) break;
printf("%sイデス\n",input > r ? "オオキ" : "チイサ"); }while( --count );
if( count == 0 ) printf ("ザンネンデシタ\n"); else printf("セイカイデス\n"); return 0;}
>>747
七行スレにでも投稿する?
2^10=1024だから解ける。
>>749
惜しい
751まーヴぉー:02/10/08 23:02
このサイトの「C言語を始めるには」
わかりやすい!?あふぉか!!!
しかも出来たばっかだしw
http://s1.buttobi.net/hiloshi/
とりあえず一行縮めてみた。

main(){int r,i,c=10;srand(time(NULL));r=rand()%100+1;do{printf("アト%dカイ\n",c);
scanf("%d",&i);if(r==i)return puts("セイカイデス"); printf("%sイデス\n",i>r?"オオキ":
"チイサ");}while(--c); return puts("ザンネンデシタ");}
>>752
スレ違い
754デフォルトの名無しさん:02/10/08 23:06
>>751
ワラタ。
つーか、イカスじゃねえか。そのサイト。
YOっしゃ。削除依頼だしてこい。
>>751
下手な解説サイトより、笑えてイイ。
つづきはあるのか?
756740:02/10/08 23:36
数と言えば自然数しか思い浮かばない
ヴァカどもばかりだな、ここは・・・
自然数に0が含まれるかどうかの議論しようぜ
758749:02/10/08 23:41
なるほど、3.14157とかされると解けんなw
小数点以下第1位までなら解けるってとこか
>>757
よし、じゃぁ、含まれる。
なぜなら、テストで0点取ったことがあるから。
まさにしzうぇんたい。
議論するものなのか?自然数・・・
761740:02/10/08 23:46
>>756
出題の意図を常識の範囲で読み取る能力もないクズ
よりはマシだろうけどな。
>>760
0が含まれると主張している人たちもいた
電波系というわけでなく・・・
>>756
無理数だったらヤだな…
>>763
無理数は無理っす

とかいったりして ギャハー
無理数って酷い訳語だよな
正の整数←→自然数
っていう定義じゃないの?
定義だから議論の余地なしだと思っていたのですが…

>>751
>2chに宣伝したっけ予想以上の反響が!
宣伝かYO!
>>751
すげー面白かったYO!
この調子で進んでいってほしいYO

とりあえず、ヲチして間違っていると思われるところは
どんどんつっこみを入れていくことにしよう
>>751
> 何も言わずに、「cd my documents」と入力しろ
普通「指定されたパスは見つかりません」と表示されるが、
君は本当にコンパイルできたのか小一時間問いつめたい。
「cd "my documents"」
じゃないのか?
>>752
本体を更に縮めてみるテスト。関係ないのでsage。
#include<stdio.h>
#include<time.h>
main(){int r,i,c=10;r=time(0)*79%100+1;do{scanf("%d",&i);printf("%sイデス\n",r-i?
"セイカ":i<r?"チイサ":"オオキ");}while(--c);return puts(c?"":"ザンネンデシタ");}
>>768
多分マイドキュメントに保存しろと言いながら、自分では他のところに保存しいるんでしょ。
771デフォルトの名無しさん:02/10/09 11:32
>>769
なんでrand使うのやめたんだ?(^_^;)
772769:02/10/09 11:56
>771
短くしたいから。
773デフォルトの名無しさん:02/10/09 12:04
プログラムを実行し始めてからの時間を返すclockという関数がありますよね?
あれは時間がclock_t型で表せる最大の数を超えたら間違った値が返ってくるんですか?
>>773
表現できる限界を超えても正しい値が返ってくるすげぇ実装方法があったら教えてプリーズ
>>774
GENKAI TOPPA
KYOなら出来る
776773:02/10/09 12:36
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/clock.3.html

よく見たら-1が返るって書いてあった。
以前見たときは書いてなかった気がしたけど、、、、
777デフォルトの名無しさん:02/10/09 12:39
777get
>表現できる限界を超えても正しい値が返ってくる
そもそも論理的にこの文章は矛盾しているかと・・・
779デフォルトの名無しさん:02/10/09 13:24
60cm浮き上がるタンはもうこないのでしょうか
DOS窓にグラフィックを描くという冗談をまだやっているのか気になる
AAですか?
いや、違う
>>775
こんなところでKYOスレの住人に会えるとは思わなかった・・
784デフォルトの名無しさん:02/10/09 16:26
ストリングをある文字だけで埋めるルーチンをなるだけ簡単な形で作りたいんだけど。
これ位しか思いつかない。

strをcharでnum個だけ埋める。
#define fillstr(str, num, char) {int i;for (i=0;i<num;i++) str[i]=char; str[i]='
\0';}

もっと良い方法があったら教えて。
>>784
memset
正直、ネタにしか見えないんでマジレスする気にならん・・
親切なやつ教えてやれよ↓
787デフォルトの名無しさん:02/10/09 16:34
>>784
memset(s, ch, strlen(s));
は?
memset()でいいと思うけど、>>787のstrlen()はマズイだろう。
memset(str, char, num); str[num] = '\0';
789787:02/10/09 17:13
>>788
だね。
仕様を勘違いした。
sprintf
memsetってint型の配列のすべての要素を1とかで初期化したい時に使えないから嫌い。







そんなことが必要な時はあまりないけど。
> そんなことが必要な時はあまりないけど。

そう?そういうケースは結構あると思うけどな。
どうでもいいが無意味な空行はやめてくれ。
ウケると思ってるのかしらんが、読みにくくてウザイだけだ。
>>792
ごめんなさいね。
でも最後の行は無駄ですね。「どうでもいいが無意味な空行はやめてくれ。」だけで十分だと思います。
>>793
まあいいだろう。
でも最後の行は無駄ですね。謝るなら謝るだけにしろ。この糞が。
>>784 strset()
>>791intset()(w
797高粘性ゲーム脳:02/10/09 19:45
>>783
KYOスレって何ですか?
798デフォルトの名無しさん:02/10/09 19:58
>>797
少年マガジンで連載中の江戸時代を舞台とした超能力漫画。

刀からカマイタチが巻き起こり、火を噴いたりするのはもちろん
絶対零度以下の冷気や最近はブラックホールも出ました。
彼らはいつもいろいろな限界を突破します。
799デフォルトの名無しさん:02/10/09 21:14
いくつか質問させて頂きます。
1、文字の色を変えるにはどうやればよいですか。
2、printf関数のようなものを作りたいのですが、引数が"で囲まれているようなものはどうやるのですか。
800デフォルトの名無しさん:02/10/09 21:17
>>799
1についてですができません。
2についてですが、作れません。
お願いです。
conio.hのgetch関数の内容を教えて下さい。
802デフォルトの名無しさん:02/10/09 21:23
>>799
1
printf("<FONT COLOR=\"#ff0000\">赤です。</FONT>\n");

2
const char *
803デフォルトの名無しさん:02/10/09 21:24
>>801
1文字取得
>>799
1についてですが、環境依存ですができます。「エスケープシーケンス」でgoogle
2についてですが、引数が""で囲まれている場合は文字列とみなされアドレスが渡されます。
>>800
バカ?
806801:02/10/09 21:25
>>803
puts関数ですか?
>>806
キーを押すとすぐに反応する。
エコーなしに一文字読む。
エコーありはgetche。

だったかな。
>>807
お願いです。
次はkbhit関数の内容を教えて下さい。
>>807
その次はoutp関数の内容を。
810デフォルトの名無しさん:02/10/09 21:50
次は僕の質問に答えてください。
WSAStartup関数の内容、使い方、サンプルソース。
int 21hについて教えてください・・・
次はlistenの内容、使い方を丁寧に教えてもらおうか。
forkのつかいかたが分かりません
>>813
手で握ってさしたりすくったりするだけだろ
816812:02/10/09 21:59
810や813は答えてもらっているのに、おいらは放置! ウワァァン
819813:02/10/09 22:02
>>815 >>817
ありがとうございます!参考にします!

>>812
( ´,_ゝ`)
>>801
キー入力があるまでgetch()の所でプログラムが止まります。
キーが押されるとバッファからキーの番号取り出し、それを戻り値として返します。
取り出したキーはバッファから消えます。
使い方の例を書きます。参考にしてください。
1、終了間際にgetch()を書いて何かボタンを押すと終了するようにする。
void main( void )
{
  ・・・
  printf("何かボタンを押してください。終了します。");
  getch();
  return;
}

2、ロープレなどで、1を押すと城へ行く、2を押すと町へ行く等と
  ユーザーの入力によって分岐させたいとき、
  scanf()やgets()の代わりにgetch()を使うとEnterキーを省略できる。
  scanf("%c",&key); → key=getch();
  if( key == '1' ) 「城へ行く処理」;
  if( key == '2' ) 「町へ行く処理」;

3、アクションゲームなどプログラムが止まると困ってしまう場合は、
  kbhit()をいっしょに使う。kbhit()はバッファにキーがあるかを調べて
  バッファにキーがあると1以外を返し、無いと0を返す。
  if( kbhit() != 0 )
  {
    key = getch() ;
    if( key == '+' ) 「ジャンプの処理」;
    if( key == '6' ) 「右へ移動する処理」;
  }
821デフォルトの名無しさん:02/10/09 22:08
キターーーーーーーーーーーーーーーー!!!!!
822808:02/10/09 22:13
>>820
その調子でconio.hに定義されている関数を全て教えてください。
>>820
すっげーいい。とくにアクションの例が。
実験してみるよ。
>>820
DOS窓グラフィックはどうなった?
825デフォルトの名無しさん:02/10/09 23:42
C言語を使ってプログラミングしたいんですけど
フリーソフトでおすすめのものってありますか?
>>825
LSIC試食版
>>825
>>2あたりも読めないような奴に勧められるものはない
>>825
フリーなPC-UNIX入れれば?
すいませんマルチになります。
web板の方が寂しいのでこちらでCGIに関するC言語のサーバー設定を聞いても
いいでしょうか?こちらの方が詳しそうな人が多そうなので…
だめなら消えます。
C言語のサーバーってなんやー?
831デフォルトの名無しさん:02/10/10 11:22
>>829
激しくスレ違いな気がするが、質問ならageて。
コンパイラが進化した・・・

warning C4553: '==' : 演算子にプログラム上の作用がありません。'=' を意図しましたか?
833829:02/10/10 12:03
聞いていいのかな?
思いっきりスレ違いは覚悟しておりますが、多分詳しい人多そうなので
教えて下さい。
IISでCGIを動かしたところperlは動くのですがCは動かないのです。
昨日までは動いていたのですが設定をいじったところ、今日は動かなくなりました。
ローカルでコンパイルしたものを.CGIに変えてあげています。
その際、C言語だと特別な設定が必要なのか教えて下さい。
本当にスレ違いでマルチで申し訳ないのですが、ここしかもう頼るところが
ありません。お願いします。
>>833
>昨日までは動いていたのですが
では必ず動くはず。
>設定をいじったところ、今日は動かなくなりました。
その変更を元に戻してください。

これで解決できなかったら、Webプログラム板に逝ってください。
>>833
>昨日までは動いていた
昨日は,全ての条件について試したのかな?
動くと思っていても,どこかに落とし穴があるかも









なんてね
836デフォルトの名無しさん:02/10/10 13:06
そうか、memsetがありましたね。
thx!>教えてくれた人
837------------------さん:02/10/10 13:55
ポインタはどういうものかは分かったが使い道がわからない。
例えば /* 関数とポインタをつかった勉強プログラム */
#include <stdio.h >
void z(int *g)
{
if (*g<50)
*g=50;
}
int main (void)
{
int a=10;
int b=20;
int c;
printf("c=?");
scanf ("%d",&c);
z(&c); /* すなわち g=&c */
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
return (0);
}
838------------------さん:02/10/10 13:56
つづき、 
で、なにもポインタを使わなくても以下のようにできてしまうような気がするのですが
#include <stdio.h >
void z(int c)
{
if (c<50)
c=50;
}
int main (void)
{
int a=10;
int b=20;
int c;
printf("c=?");
scanf ("%d",&c);
z(c);
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
return (0);
}
気がするのですか、そうですか、良かったですね。
840nanashi:02/10/10 14:06
 99999以下とは限らない正の整数を次々と読み、データの個数と最小値、
2番めに小さい値および3番目に小さい値を印字するプログラムを作れ。ただし、
データがつきたことをあらわすために、0または負の数を入力することにする。

このアルゴリズムのを書いてください。流れ図でも箇条書きでもよいです。

 
841------------------さん:02/10/10 14:09
あ、てか自分でわかったかも
ポインタつかわないと
void z(int c)のcと下のcは別物あつかいみたいになってしまう??
宿題は宿題スレへ逝け。
ただし丸投げする前にすこしは自分で考えろ。
843nanashi:02/10/10 14:13
逝ってきます
844------------------さん:02/10/10 14:14
てか受け渡しっぱなしでcに帰ってこないか。
あー自分でわかりました。
845デフォルトの名無しさん:02/10/10 14:37
最小値の表し方は?
846デフォルトの名無しさん:02/10/10 14:38
>>845
(・∀・)?
>>845
くすっ。コボラーしねよ。
848デフォルトの名無しさん:02/10/10 14:52
コボラーってなんですか?
>>848
コボルする奴。
>>845
limits.hを調べるべし
>>840
最大値、2番目に大きい数、3番目に大きい数を初期化する
カウンタを初期化する
1. 0か負数が入力されるまで繰り返し
  1.1.入力値が1番目に小さい数かどうか調べ、
    1番目に小さい数未満の場合、1番目に小さい数と入力値を交換する。
  1.2.入力値が2番目に小さい数かどうか調べ、
    2番目に小さい数未満の場合、2番目に小さい数と入力値を交換する。
  1.3.入力値が3番目に小さい数かどうか調べ、
    3番目に小さい数未満の場合、3番目に小さい数と入力値を交換する。
  1.4.カウンタをカウントUPする
2.データの個数と最小値、2番めに小さい値および3番目に小さい値を印字する

※1.1.〜1.3.は処理が非常によく似ているので関数にするのが望ましい
>>851
交換した後、ずらす処理が必要では?
>>851
1番目に数値が入るとき、入れる前に、
2番目の値を3番目に、1番目の値を2番目に入れたりせなあかんよ。
854デフォルトの名無しさん:02/10/10 16:41
C言語をやりはじめたばかりの者です。独習Cをやっているのですが、
いくら読んでも腑に落ちなくて、困り果ててのカキコです。
以下のプログラムは123と表示するだけのものなのですが、説明文に
よるとmain()がfunc2()を呼び出し、次にfunc2()がfunc1()を呼び出す
となっています。問題はfunc2()がfunc1()を呼び出すというところです。
どうしてfunc2()がfunc1()を呼び出してくれるのですか? 
たぶんすごく初歩的なことなのでしょうけれど理解できません。
これは単にそういう約束だと思えばいいのでしょうか。
教えてください。

#include <stdio.h>
void func1(void); /*プロトタイプ宣言*/
void func2(void);

int main(void) /*プログラムの開始位置*/
{ func2(); printf("3 ");
return 0; }

void func2(void)
{ func1(); printf("2 "); }

void func1(void)
{printf("1 ");}
>どうしてfunc2()がfunc1()を呼び出してくれるのですか? 
...
> void func2(void)
>{ func1(); printf("2 "); }
  ~~~~~~~
func1()を呼び出しせって書いてあるやん。
>>854
func2()関数の中にfunc1()の呼び出しがあるから。
void func2(void)
{ 
func1();    ←ここ
printf("2 "); 
}
>>854
mainがfunc2を呼び出してるのは理解できて
func2がfunc1を呼ぶ出すのは理解できないのか?


・・・・不思議だ・・・
858デフォルトの名無しさん:02/10/10 16:59
>855>856>857さん。ありがとうございます。
おかげさまで、だいぶ分りました。なんていうか数字の順番で物事を考える
癖が抜けきらないというか・・・・・。一番の次は二番だろという
ような。
つまりmainは直後のfunc2()を呼び出し、その下のvoid func2(void)
に行きvoid func2(void) はfunc1();で1番下のfunc1();に
流れて最後に1まで行って表示して、またfunc2()戻って今度は2を
表示して、それでmainが最後に3を表示するということで、いいんですか。
>>858
合ってます。
860デフォルトの名無しさん:02/10/10 17:04
>>858
定義順と呼び出し順に相関関係はないよ
#include <stdio.h>
void mona(void); /*プロトタイプ宣言*/
void giko(void);

int main(void) /*プログラムの開始位置*/
{ giko(); printf("2ちゃんねる");
return 0; }

void giko(void)
{ mona(); printf("ギコ "); }

void mona(void)
{printf("モナー ");}

なら問題なく理解できたと言うことなのかなぁ。
862854:02/10/10 17:10
>860 定義順と呼び出し順に相関関係はないよ

そのようですね。さっき試したら問題なく表示されました。
まだプログラムの流れをすんなり掴めていないみたいなので、
もっとたくさん練習してそういうことが分るようにがんばります。
863851:02/10/10 17:17
>>852-853
頭の悪いお前らは、交換してしまえばずらす必要がないことが
理解できないようだな。じゃあこのソースを見ても無駄か(w
#include <stdio.h>
#include <limits.h>
static void swap(int *n, int *m);
int main(void)
{
  int n, min1, min2, min3;
  int cnt = 0;
  min1 = min2 = min3 = INT_MAX;
  while(scanf(" %d", &n) == 1 && n > 0) {
    if(n < min1) swap(&n, &min1);
    if(n < min2) swap(&n, &min2);
    if(n < min3) swap(&n, &min3);
    cnt++;
  }
  printf("cnt = %d, min1 = %d, min2 = %d, min3 = %d\n",
      cnt, min1, min2, min3);
  return 0;
}
static void swap(int *n, int *m)
{
  int tmp;
  tmp = *n; *n = *m; *m = tmp;
}
Cでの構造体の宣言についてお訊きしたいのですが、
typedef struct fooA {
int tmp ;
fooB *whole ;
} fooA ;

typedef fooB {
fooA instance1 ;
fooA instance2 ;
} fooB ;

このような場合、どのように宣言するとコンパイルが通るのでしょうか。
struct fooB;

typedef struct fooA {
int tmp;
fooB* whole;
} fooA ;

typedef struct fooB {
fooA instance1;
fooA instance2;
} fooB;
struct fooA{
int tmp ;
struct fooB *whole ;
} ;

struct fooB {
struct fooA instance1 ;
struct fooA instance2 ;
} ;
867864:02/10/10 17:29
>>865, >>866
thanks !
868デフォルトの名無しさん:02/10/10 17:40
*.iniファイルへの値の書きこみ、値の取得はどのようにすればいいんですか?
>>863
…アルゴリズム変わってないか?
>>868
どうせWindowsだろうからコレでも使っとけ
ttp://www.mars.dti.ne.jp/~suzunari/suz/suzsoft/regini_readme.htm
871デフォルトの名無しさん:02/10/10 18:31
C言語で行列→逆行列にするプログラムってどのように作ればよいのでしょうか?
誰か教えてくれませんか?
マルチカコ(・∀・)イイ!
873デフォルトの名無しさん:02/10/10 18:39
main()関数の引数の argc と argv の
言葉の意味はそれぞれどんな意味があるんですか。
argument_count
argument_value
876デフォルトの名無しさん:02/10/10 18:44
CでCのコンパイラを作りたいのですが、どういう仕組みなのですか?
argument_vector no yokan
vector な罠
>>876
main()を最初に処理する
kekooooon
>>876
ギコBASICを参考にしろ
882875:02/10/10 18:52
知ってたけどね
ハイハイ
返事は1回
ハーーーーーーーーーーーーーイ
(・∀・)
>>876
こっちのスレで聞くがよいかと。

『コンパイラ・スクリプトエンジン』 相談室 2
http://pc3.2ch.net/test/read.cgi/tech/1021136715/
888デフォルトの名無しさん:02/10/10 20:13
std::

ってなに
>>888
> std::
さぁ?Cにはそんなものないよ
>>889
C++だけならまだいいです。どうも
>>863
ずらしてるじゃん
>>851
つか、リングバッファ使えばいいのでは?
893892:02/10/10 20:45
ごめんなさい、よくありませんでした。反省します。
894デフォルトの名無しさん:02/10/10 20:59
main()
{
int m,n;
n=3;
m=n++

printf("%d-%d",n,m);

return 0;
}

が、4-3となる理由がわからん。だってn=3っていってるのになぜに4って言うの?
俺ってバカ?
租借して租借して説明してくれる人。おながいします。
m=n++
でnがインクリメントされてる
>>894
> 4-3となる理由がわからん。
俺は m=n++ の最後にセミコロンがないのにコンパイルできる理由がわからん。
n++;
++n;
上記はどちらも n に1を足しなさいという意味

m=n++;
まず n の値を m に代入してから n に1を足すという
意味

m=++n;
まず n に1を足してから、その値を m に代入しなさい
という意味
898デフォルトの名無しさん:02/10/10 21:15
mはどちらも同じ数字になりますよね?

でもなんでn自体の値が変わるのかがわかりません。
だってnは3っていったじゃん。

;忘れました。ごめんなさい。ごめんなさい。ごめんなさい。
>>898
>>895は読んだ?
>>898
まずプログラムの基本ができてない気がする。
数学では n=3 と書いたら紛れも無く n=3 だが、プログラムでは
n の値は刻一刻と変化すると考えてください。

n = 3;
m = n + 5;
n = m;
printf("n = %d",n);

こう書いたら、上から順番に解釈されていって n = 8 と表示される。
901デフォルトの名無しさん:02/10/10 21:25
>>900

ありがとう。ございます。

とってもありがたい説明です。

なんだかやる気が出てきました。

ほかの皆さんもありがとう。ちゅっ
m=n++ならmは4じゃないのはなぜ? なしてmが3になったの? もちろん実行してみたんだけど、おいらもわからん。
903デフォルトの名無しさん:02/10/10 21:47
>>902
m=n++;
 ↓
m=n;
n++;


n=++n;
 ↓
m=n+1;
>>903
おい、間違えてるぞ
>>903
> n=++n;

?? また、未定...。
906デフォルトの名無しさん:02/10/10 21:53
>>903
なんか違うな
907デフォルトの名無しさん:02/10/10 21:53
>>903
m=++n;
 ↓
++n;
m=n;
だろが
:ま  た  未  定  義  か :02
システムファイルの中身をぐちゃぐちゃにするプログラム作ってもいいですか
もうCスレの代名詞だね「また未定義か」。
次スレの副題に付けるか?

C言語なら俺に聞け「また未定義か」 <1>
C言語に将来はありますか?
>>909
おれが書いてやる

FILE* fp = fopen("システムファイル", "w");
fputs("ぐちゃぐちゃ", fp);
fclose(fp);

どうよ?
>>911
君の将来よりはまし
>>912
ありがとうございます!
915912:02/10/10 22:09
人に感謝されるというのは気持ちのよいことだ・・・
なんでCスレはすぐにネタスレになるんだろうなぁ
917デフォルトの名無しさん:02/10/10 22:26
みんなCが好きだから
やっぱりBよりもCの方がいいからね
もちろんプログラム言語の話だよ。
俺はB言語を使っていたから難なくC言語を覚えられたよ。
920デフォルトの名無しさん:02/10/10 23:03
>>898はプログラマーですか?
C言語を習い始めて1時間経った人よりお馬鹿です。(合掌)
最初はかるーくA
次にイヤンB
ウハウハのC
最後はムフフDで合掌。
922デフォルトの名無しさん:02/10/10 23:17
みんなオラにちょっとずつ力を分けてくれ。

スタックをモデルにしたプログラム作ってけろ ^^
>922
ちょっとづつな。
int
スタックをモデルにしたプログラムって何?
Forthとか、PostScriptとか?
              少しは右側使えよ
              はじめてのC
>>922
54*12/+
>>921
Ada > Basic > C > Delphi ??
波瀾万丈の言語歴だね
929デフォルトの名無しさん:02/10/11 01:12
FILE *fp;
char mona[10];
char giko;
int ret;


ret = fread ( &giko,sizeof(giko),1,fp );
printf ("%d\n",ret );

としたときretに0しか入りません。
引数でファイル渡していて、そのファイルには確実に
数バイト書き込まれているはずなのに"0"しか返ってきません。
freadって読み込んだバイト数を戻り値として返すんですよね?

>>929
freadが返すのは読み込んだ要素数だ。
>>929
その部分だけを見ると間違ってないみたい。
あとはfopenとか、その後の処理がどうなっているかだね。
fopenに失敗しているまたはfopenそのものを忘れている
933デフォルトの名無しさん:02/10/11 04:18
char *zonu;
char *str="abcdefghi";
int val;

zonu=(char*)malloc(func()+1);
strncpy(zonu,str,func());

便宜上func()は3を返すとします。つまり
zonu=(char*)malloc(4);
strncpy(zonu,str,3);
このあとstrncpyだとヌルが
自動付加されないんですが
どうすればヌルを付けれますか?
strncpyは挙動があやしいというか仕様が古い
callocで0で初期化しといたら?
>>934
うまく逝きました。サンクスレス
おれはmemcpyと終端'\0'代入をお勧めする。
初期化めんどいときはstrncpy+終端\0

strncpyってsourceの文字列がdestinationの
バッファサイズ未満の場合, 残り全部を\0で埋めるんだよね
なぜなんでしょう?
938デフォルトの名無しさん:02/10/11 05:49
>>937
・C FAQ 日本語訳
に書いてるよ。
>>938
サンクス

疑問なのはこちらです
>>strncpy()の関連する奇妙なところは、
>>指定された長さになるまで\0を埋めることである

strcpyみたいに1個だけ\0を埋めるだけじゃ駄目なのかなぁ?
940デフォルトの名無しさん:02/10/11 06:04
c言語でネットワークなプログラムのことをしりたいのですが
どのような書籍がお奨めでしょうか
TCP/IPプログラミング
などいろいろな本があるみたいですが
いろいろあるのでうかつに買えません
教えてください
941デフォルトの名無しさん:02/10/11 07:49
すみません。どうしても結論がでないので、お聞きします。

(1)メモリ上のデータの先頭アドレスを「ポインタ」と呼ぶのですか?

倉薫の本を読むと、書籍の前半では、ある変数の(先頭)アドレスを記憶させる変数が「ポインタ」と説明が
してあるのに、文字列処理関数群の説明当たりでは、コード中に書き込んであったり、gets()で取得した文字列の
先頭アドレスが「ポインタ」みたいな説明になっています。とにかくデータの先頭アドレスを「ポインタ」というので
すか?


(2)gets()などで文字列を習得すると、メモリの特定領域に記憶されるわけで、それをプログラムで利用
するときには先頭アドレスが必要だと言うことは分かります。しかし、ソースコード内に「文字列リテラル」みたいな
形で文字列が書き込まれているとき、その先頭アドレスの取得が必要なのですか?
そもそも、コンパイル後のリテラルの扱いはどうなっているのですか?一般のコードの中に埋め込まれているのですか?
>941
アドレスを入れる変数がポインタ型
関数にポインタ「型変数」を渡すと書いてあってもおかしくないのでは
943デフォルトの名無しさん:02/10/11 08:24
>>941
CPUがどんな風に働いてるのかを勉強したらすぐわかると思うわれ(レジストリな)
ポインタって言葉は、「アドレスを渡すとか、アドレスを扱う」ってニュアンスだとわかりやすいんじゃね?
ちなみに、gets()関数の引数には、ポインタを返すって決まりだったと思う
文字列関係のポインタは、基本的に先頭アドレスを渡す。
おそらく図柄を見てイメージができてるとわかると思うんだがなー
>>941
文字列リテラルは別のところに集められるのが普通。
コンパイル後のバイナリをバイナリエディタなどで見るとわかると思う。
(アセンブラわかるのならアセンブラコード見てもいいと思うけど)

プログラム実行時には実行ファイルから文字列リテラルをメモリ内に読み
込んでその先頭アドレスを使用する。
>>943
レジストリ?
946944:02/10/11 08:30
文字列リテラルをメモリ内に読み込むのはOSな。
947デフォルトの名無しさん:02/10/11 08:34
>>942

function(文字列のポインタ、文字列のポインタ)

function(str,"なんなのこれ")

みたいな説明になってるんだけど、変数strの識別子が先頭アドレスを表すことは分かるけど、
”文字列”を直接関数に引数で渡すと、ポインタを渡したってことになるわけ?
>>947
そうなる。
949943:02/10/11 08:36
>>945
すまん・・・レジスタな
950デフォルトの名無しさん:02/10/11 08:37
いまきづいたのだけど、本によって

「ポインタ」「ポインタ変数」が別扱いのものと同義語のものがある。
951デフォルトの名無しさん:02/10/11 09:21
short array[] = {0,1,2,3};
short *arr_pt;
short i,j,num;

arr_pt = array;
for(i = 0; i < 4; i ++)
{
num = arr_pt[i];
printf("%d\n",num);
}
出力は 0123。
ポインターは銭湯アドレスつっても、
どこでもさせるようです。

char *string = "AHO";
文字列リテラルはテキストセグメントに確保さるようですが、
以後は別段stringをつかってください。
>>947
ダブルコーテーションで囲まれた"文字列定数"←は
つまりコンパイルの時点で(強引な表現をすれば)exeに埋め込まれるわけで
関数に文字列定数を渡すようなコーディングをした場合は
その文字列定数が、文字列定数が埋め込まれた場所を指すconst charポインタに
置き換えられていると思えば良いのではないかな
>>951
どうでもいいけど、どうしshort?
>>953
951の書き込みは全体的に良く分から
955デフォルトの名無しさん:02/10/11 09:53
リテラル。セグメント。
初耳・・・どんな意味で?
956951:02/10/11 11:03
僕に聞かれてもあんまりシランっす。

引っ張り出した本に書いてありますた。

--------------------
スタックセグメント // ローカル変数とか



ここから--------------
ヒープ // mallocにより動的確保

BBS // グローバル変数(初期値なし0)

データ // グローバル変数(初期値あり)
-----------------ここまで、データセグメント
テキストセグメント // プログラムのコード部分が
// おさめられている読み出し専用領域

てなふーに割り当てられるっちゅ−よーなことらしいです。




シランでもいいと思いますた。
>>956
それは個別の実装の話だから一般論として語るもんじゃないよ。
おsage。
わすれてた。
>>956
シランでもいいかどうかは時と場合によるが。
ついでに言うと、BSSだと思うが。BBSじゃなくて。
> 957

うぅ、
言われてみればLinux固有だと気がつきました。
あほなこと語ってしまいましたすみません。
>>970
次スレよろしこ
>どこでもさせるようです
arr_ptはarrayの先頭のアドレスを受け取っただけ。
arrayを宣言したときにその後ろに連続してデータが入るので、
arr_pt[i]で辿る事が出来る。
963962追加:02/10/11 17:57
プログラムはarr_pt[i]=*(arr_pt+i)と解釈している。
i[arr_pt]
> 963

そうですよね。
ぽいんたーっていうと、ふつーそれしか思い当たらないので
>>941さんが銭湯アドレスって言葉にこだわって混乱してるのかと思って
ぽいんたーは銭湯アドレスを取得したら、
メモリー領域にアクセスするのに使えると思えばわかりやすいかと思ったら
なおさらわかりずらかったです。

それよりも、>951で不可解なのは、
変数 j の使い道だと思います。
>>894
s/租借/咀嚼/g
:)
967デフォルトの名無しさん:02/10/11 19:29
2つの入出力があります。
入力ではselectを使いたいんだけど、出力はfprintfを使いたい。
つまり、このままではファイルポインタとファイルディスクリプタが
同居してしまうのですが、こういうばあいの
どこまでの操作なら安全でどこからの操作が危険か
というガイドラインはありますか?

そもそもFILE*使うなよ、というのはありますが まあそれは置いといて。
968デフォルトの名無しさん:02/10/11 20:12
while ( fgets ( str,256,fp ) != NULL ) {
getchar ();
printf ( "%s",str );
}
fpで示すファイルを一行づつ読みこんで
Enter押すまで止めておくプログラムです。
例えばファイルの中身が
123
4567
89
10
というもだとしてこのプログラムを実行すると
123

4567
1行スペースが空いてしまいます。
fgetsが復改文字も読みこむのが原因ですよね?
スペースの空かないプログラムを作りたいのですが・・・
strlenで長さを測って、最後尾の"\n"を取ればいいと思うのですが
各行で長さがちがうので困っております。
ご教授おながいします!
>>967
ファイルポインタから対応するディスクリプタ取り出せるよ。それ使えばOK
970デフォルトの名無しさん:02/10/11 20:40
>>969
その方法を教えてください。
逆はfdopenでできますけど。
971970:02/10/11 20:41
次スレたててきます。
>>968
> fgetsが復改文字も読みこむのが原因ですよね?
いや、復改文字がエコーバックされるのが原因
でも、改行が取りたかったら
str[strlen(str) -1] = '\0';
とかしろ
>>972
ありがとうございます!

・・・・やっぱりFILE *からFDを得る関数があったんだ・・・・
お疲れ様です
記念パピコV(^o^)V
1000いただいてもよろしいのですか?
for(i = 20;i > 0;i ++)
{
printf("%d\n", i+980);
exit(0);
いただいちゃってください
// >>983
// 終わらせるな!ヴォケ
// >>984
// エラー出すなヴォケ
}
void func(Object* nanika)
{
// 988さん、Object型の扱い方教えてくらはい
//>>980
//ループお椀ね円だよ!
return 0;
} // nanika は一度も使用されませんでした。
>>990
>>987で終わってるじゃ名井
994
まんこ
ちんこ
すっせんんー
せせせせせんんんー
999
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。