2 :
デフォルトの名無しさん :02/09/29 04:15
4 :
デフォルトの名無しさん :02/09/29 04:16
ござーるござるよハットリくんはー ゆかいなみかたーにんじゃでござるー にんじゃでござるー
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] のほうが早いらしい
その前にコンパイルできないと思うんだが・・・
21 :
デフォルトの名無しさん :02/09/29 04:45
>>17 ごめんなさい。2行目の意味がわからないです・・・
>>18 そうなんですか?n--と一回やるだけだからですか?
22 :
デフォルトの名無しさん :02/09/29 04:47
>>20 コンパイルはできました。きちんと動きました。
ただ、本当にこの方法でよいのかと思い質問しました。
>>21 コンパイラがすげえ賢かったら
実際にインクリメントされるレジスタは一個だけかもしれない
>>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なんですが。
>>28 もしかして、qsortと同じ働きをするものを自分で作りたいの?
30 :
デフォルトの名無しさん :02/09/29 04:57
>>29 そうです!
というかもうつくりました。
ただ、本当にこんな方法でいいのかと・・・
>>28 >型が決まっていれば
だからサイズを渡すんだろう?
>>28 そういう意味ね。
同じようにコールバックで実装すればいいじゃん。
ただしこの場合でもコールバック関数の方では
あらかじめ型を知っておく必要がある。
型情報をとらない(とれない)だから、memcpy系の方法で 移動させてるんじゃないの?
あ、ごめん。31の方が正論。
>>32 その型というのは型のサイズのことですよね?
>>16 で書いた関数のnがそれにあたります。
>>33 そのためのバッファの大きさがコンパイル時に決まらないのでmemcpyは使えないかと・・・
また失敗は許されないから、mallocも使えないし。
>>21 19の言うとおり環境依存だけど
nはレジスタに置かれて
Pentium系だと
v1[n],v2[n]は*v1,*v2と速度的に同じくなる
++v1,++v2 がなくなる分だけ早いよ
>>31 決まっているというのは、常に同じ型を扱うという意味です。
>>37 > Pentium系だと
> v1[n],v2[n]は*v1,*v2と速度的に同じくなる
> ++v1,++v2 がなくなる分だけ早いよ
そうとは限らん。
コンパイラがソースと同じバイナリを吐き出すとは
限らない。極端に言えばどちらでも同じコードが
生成されるかもしれない。
>>36 あーなるほど解ってなかった。とりあえず "qsort.c" でぐぐると
実装例が出てくるね。たしかに可変サイズのバッファなんか使ってないようだ
結局、自分で実装するなら16のような方法でいいと思うぞ。 他にやるとすれば、intのサイズずつ処理するとか。
glibcのqsort.cは交換の部分をマクロにしているね
>>42 わかりました。ありがとうございます。
添え字を使うか今と同じポインタを使うかは自分の環境で速いほうを使いますね。
>>43 実用レベルのライブラリで do { statement; } while(0) 形式のマクロが使われてるのって始めて見た。
俺が気が付いてなかっただけで意外とあるのかも…。てっきりDQNプログラマ用の構文だと思ってたのに。
そういえば添え字かポインタかよりも、関数の再帰呼び出しでクイックソートを実現していることの方が速度的に問題があるかも・・・・
>>45 なんにつかうのそれ
breakでぬけたりしたいの?
>>48 あれだ、ブロックにして関数の途中でも変数を定義できるようにすると・・・・
>>48 俺は使わないけど、
#define print_10(string) \
do { \
int i; \
for(i = 0 ; i < 10 ; ++i) { \
printf("%s\n", string); \
} \
} while (0)
そんなマクロ組むくらいならinlineで関数書けばいいのにね と思ったところではじまらないしおわらないわな
>>52 あのさあ、、、
もう突っ込む穴も無くなった。
55 :
デフォルトの名無しさん :02/09/29 07:21
age
>>51 で宣言したi(int i; のi)の適用範囲を
明示したいとか理由があるんでしょ。
57 :
デフォルトの名無しさん :02/09/29 12:26
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はどちらも変わらない。
do{}while(0)は{}の数の対応も検出でき(以下略
初心者でスマソ・・・・ポインタを使うことによって得られる利点て実際の所どんなもんなんですか? 参考書とかの例題見ても、これなら使う必要ないよな、とか思ってしまうのですが。
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が何をする関数かわからん。
文字列のオブジェクトから文字列を切り出して切り出した文字列のオブジェクトを作成して返すんだろうか?
>>72 そんな関数定義されてないみたいですけど。少なくとも man や、string.h には。
>>73 文字列の何番目から何番目までを取り出す、っていう関数です。
76 :
デフォルトの名無しさん :02/09/29 16:35
cなら、先頭はポインタで指定してstrncpy使うしかないと思います。
77 :
デフォルトの名無しさん :02/09/29 16:40
strnlenはGNUの拡張らしいんですが、どの環境なら使えるのでしょうか?
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; }
>>78 ぬぉっ。さんくす! 試してみて、漏れライブラリに追加しておきます。
# いい人だね。
>>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");
>>53 どこがネタだかわかんないんだけど
何かおかしなことを言っているんだったら
具体的に指摘をしてください
今日一日考えたけどわかりませんでした
91 :
デフォルトの名無しさん :02/09/29 20:56
>>52 53がネタかCでインライン関数が使えないと思っているだけ。
for を含む関数をインラインにするのはどうかと思う つうことじゃないの?
なるほど。つまり >91は コンパイラの拡張機能を勝手に標準だと思っているか、 すべてのコンパイラがC99に準拠していると思っているか、 CとC++の違いをわかっていない、 つまり自分がネタを披露していることに気づいていない ということですな。
C99 って標準じゃないの?
>>52 はインライン関数がC99からではなく、最初から使えたと思いこんでいるところが痛いんだろ。
最初から使えたと思っていなければあんなレスはできないはず。
漏れはC99から始めたので最初から使えましたが、なにか?
つまり移植性をまるで考えに入れてないってことで。
自分のコンパイラで使える機能は他のコンパイラでも 使えると思っている奴って、ある意味すごいな。 実用レベルのライブラリは一生作れないだろうけど。
100 :
デフォルトの名無しさん :02/09/29 21:51
ちっちぇーなー 誰でも知っていることでえらそーにグダグダ書いて。 使ってるコンパイラによるんだから揚げ足取りやっててもおわんねーだろ。
> 使ってるコンパイラによるんだから だからinlineを使うのがまずいと言われていることに 気づいているのだろうか。
103 :
デフォルトの名無しさん :02/09/29 22:15
インラインで書くべき処理じゃないということが要点なのでは? いつから使えたかというのは2次的なことで。
104 :
デフォルトの名無しさん :02/09/29 22:16
代入式って何で j=i+50; とは書けないんでしょうか? 超厨房質問でしょうがよろしくお願いします。
すいません。書き間違えました。 代入式って何で i+50=j; とは書けないんでしょうか? 超厨房質問でしょうがよろしくお願いします。
>>104 かけないわけないでしょ。
きちんとjとiを定義した?
>>105 当たり前。
i+50は左辺にならない。iがポインタで*(i+50)ならできるけど。
108 :
デフォルトの名無しさん :02/09/29 22:19
「左辺には」じゃなくて「左辺値には」だな。
>>103 だったらマクロでも同じ事じゃん。
まあネタだったんからどっちでもいいや。
代入先は左辺に書かなければならない
>>106 すいません。書き間違いです。
>>107-108 =の演算子は「右辺値を左辺値に代入する」っていう決まりなんですか?
内心i+50の結果がjに入るのを期待したんですが・・・
>>112 =は左にあるものに右の結果を代入する演算子だぞ(^_^;)
>>112 つまり、x = yと書くとき、
「x の値が y に入るか、y の値が x に入るかが不定だったらいいなあ♥」
ってことか?
>>115 それが不定だったら俺はCを捨てる(笑)
未定義の方がイイ!
なるほど
>>115 んで、代入方向を明示的に指示するのには x<=y, x=>y などとするんだな。
もちろん、ifなどの条件式と通常の部分での間違いを防ぐために
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 環境による。
でもその程度ならよほどタコなコンパイラでない限り
どちらも同じコードになると思う。
128 :
デフォルトの名無しさん :02/09/30 00:48
>>125 ちなみにビット操作で0にするって、どうするの?
x ^= x Z80じゃあるまいし。。
>>129 それ、よくやってたなぁ。今じゃ役に立たない知識だけど。
>>129 まじでそんなコードを書く人がいるの?
同じ数同士XORを取れば確かに0になるが・・・・
>>127 ていうか、最適化時に xor にしないコンパイラなんて存在するんだろうか
xoreax, eax VC++6.0はXORにするみたいだな。
いうなれば定石みたいなもんだったからな。 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にしているよ
142 :
fuck! :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"
143 :
fuck! :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
なんだなんだ?荒らしか?
>>134 ,135
x86では今でも XORでクリアするのが定石だと思う。
フラグを破壊したくない時だけ mov eax,0 かな。
Pen4ではどうなったか知らないけど。
あうん、なんか過去形で書いてたな。 Pentium 4 なら 0.5 クロック命令だね
>>147 Pen4でも 即値のロードと XORのクロックは変わらず?
もしそうだったらやはりXORが定石かな?
xor でいいんじゃないかな? 命令長は xor なら 2 バイト、即値なら movzx で 3 バイトだから
>>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?
>>156 重なり合う領域だからmemcpyはまずい。
あ,そうか これからポインタの本ちょっと見返してみるよ
>>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
ポインタについて今勉強しているのですが、 今読んでいる本のところで float balance[10][5]; float *p; p=(float *) balance; ←← *(p + (3*5)+1) ←←の所がよくわかりません。 float *(balance); でわおかしいのですか? 基本的なことで申し訳ないのですが、 どなたかよろしくお願いいたします。
177 :
デフォルトの名無しさん :02/09/30 17:59
C言語で putc()関数とgetc()関数を使って、 バイナリファイルのコピーを行っているのですが、 コピー後のファイルの末尾にゴミ(0xff)がついてしまいます。 これが付かないようにするにはどうすれば良いんでしょう
>>177 多分 EOFのゴミです。if (feof(fp)) を使って EOFをスキップすれば
いいはず。
>>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への変換では?
>>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]?
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回解放した。
ハンドルを余分に解放した。
のどれかと思われ
領域を広くするとバグがなくなりました。 ありがとうございます
>>205 uwa〜、怪しい。
ちゃんとどこが悪いのか掴んだんだろーな。
たまたま、動いてるだけかも知れんぞ。
>>205 sz = 100;
p=malloc(sizeof(sz));
こんなことしてないだろうな?
ありゃ、新スレ来てみたら、もう200超え。 お世話になりマウス。m(^_^)mペコ。
文字列ポインタを数値に変換するにはどうしたらいいの? strtokで数値でできた文字列を分割したあと 数値の入れ方がわからないんだけど誰か教えて下さい.
>>210 意味が良くわからないのだが、printf("%p", pointer);ってことか?
すいません. 数値で出来たテキストファイルを数値配列に読み込み 計算をしたいと言う意味です.
sscanf
数値変数 = atoi(文字列へのポインタ); なんじゃないのか? 数値変数 = (数値変数)文字列ポインタ; なのか??
>文字列ポインタを数値に変換する っていうのがいまひとつ分からんが、 ↓こんな感じかい? char *tok; int num; tok = strtok(str, sepa); num = atoi(tok);
普通はatoi,atol系使うよな。
こんな初歩的な質問にまで答えていただいて ありがとうございます. 早速やってみます.
再度すいません. 下のソースはエラーが出るんですが何がいけないですか? 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上で動く画面制御のライブラリってないんでしょうか カーソル移動したり、画面クリアするやつなんですけど。
p=strtok('\0'," ") のところでエラーが出ます. 本で見たらこうなってたのでやってみました. ただファイルへの書き込みではうまくいくんですけど.
224 :
デフォルトの名無しさん :02/10/01 02:06
>>221 cursesをキーワードに検索すべし。
225 :
デフォルトの名無しさん :02/10/01 02:08
>>222 その本がC言語を主題として書いてるのなら、捨てたほうがいいと思う。
なんかそんな気がしてきました. それでエラーの位置なのですが, 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++; } 何がいけないのですか?
自爆しましたぁ〜 strtok('\0'," "); の第一引数のNULLは、「次のトークンを探す」場合にそうしてするみたい。 m(__)m
じゃあ何でエラーになるのでしょうか?
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, " "); に変更すべし。
あぁ、また自爆だぁ〜 if(p)があるから、atof(NULL)とはならないのかぁ〜〜〜〜〜〜。m(__)m にしても・・・、strtok()の結果って、ホントに数字の羅列になってるのかな? データの中に、空白文字が複数連続して書かれてあったらどうなるんだろ? スレ汚してごめんなさい。m(__)m
>>226 aかbがdataのサイズを超えているのではないかな?
どう見ても b = 0 が抜けているが。
つーか、なんでどういうエラーなのかを言わんのだ?
エラーの内容は 「?????のメモリが????を参照しました. メモリがwrittenになることが出来ませんでした.」 です. 自分でもいろいろやってみるのですが,エラーなんです. 教えてください.
> p=strtok('\0'," "); 何したいんだ?
× p=strtok('\0'," "); ○ p=strtok(p," "); 誰も突っ込まんから一応突っ込んでおく。 whileが無限ループになってるからいつかはエラー出るだろうなあ。
b=0は宣言のときに書いてあります. それでただ読み込んでファイルに書き込むことは出来ました. よって読み込みの段階での間違えは無いと思います. つまりatofのところ(226で書いたところ)でうまくいかないみたいです. 何が間違っているのでしょうか?
>>239 で、dataはどのくらいのサイズ設定してあるんだ?
仮にdata[10][10]としてあったときに、b=10のときエラーになることくらいは分かってるよね?
10*10と仮定すると、
if( a < 10 && b < 10 ){
data[a][b]=atof(p);ここでエラーになります.
}
ってやれば回避できる。
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では簡単にはできないか
そういえば、最初 #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上のどこかに飛ばすにはどうしたらいいでしょうか 何を飛ばすのか、そもそも「飛ばす」とはどんな処理・動作・結果を指しているのか? 具体的に書けや (#゚Д゚)ゴルァ!!
>252-254 回答ありがとうございます。 言い方悪くてすいません。 exeを実行語、ヤフーなりgoogleなりIEが開いて表示する って言うのをやりたいです。 >252 おもしろそうなので詳しく調べて見ます!! >253 個人的に使いたいのでCGIは無理ですが、勉強になりました。 もしもCGIを使う事になったら使用させていただきます!! >254 ごめんなさい(T_T 次からはもっと詳しく書かせていただきます!!
>>256 最初の1回だけなら、
ShellExecuteでIEのフルパスと対象のURLを書けばイイかも
printfのフォーマット指定で「小数点以下の無効なゼロは表示しない」って無いんですか? 0.01fを%fでやると0.010000ってなっちゃいますよね?
260 :
デフォルトの名無しさん :02/10/01 14:08
261 :
デフォルトの名無しさん :02/10/01 14:19
コンソールアプリとWindowsSDKをやるだけなんですけど、 VC++を買う必要はありますか? 今の環境はBCCに専用のエディタを組み合わせてます。
>261 根性があれば必要ない プラットフォームSDKはBCCに含まれてるから がんばってMSDNライブラリに検索かけまくる (抜けがあるけど・・・)
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だ
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; ・・・・
>>282 &が要るかどうかはhogeの型によるだろ。たとえば
char hoge[10][MAX2];
だったら &は不要。
あ、俺がよく読んでなかっただけだわ。 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'; を入れたいんですけどドウスレバヨロシイノデショウカ?
>290サソ アリがd コソパイルできたけどcore dump吐キヤガッタ ヽ(`Д´)ノ ウワァァン!! ガンバッテミマス
293 :
デフォルトの名無しさん :02/10/02 10:59
>>292 解凍ありがとうございます。
私もFlockには目をつけていたのですが何故か使えません。
UNIXではないんですが…
ヘッダーが無いとVCがおっしゃるので。
ショートカットのリンク作るやつでやろうかなとか考えてます。
ありがとうでした。
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 *' で
異なっています。
そのまんまだと思うけど…
すみませんどのように修正すればちゃんとコンパイルできるんでしょうか? 超初心者ですみません・・・
NULL
ありがとうございましたちゃんとできました感謝〜
303 :
ポチョムキン :02/10/02 19:52
解決しました。お騒がせしました。
304 :
ポチョムキン :02/10/02 19:54
>296 ばっちりでした。ありがとうございました。
Windowsのコンソール用のアプリケーション用の画面制御ライブラリ というのはありませんでしょうか(できればフリーで)
>>306 Windows2000のDOSプロンプトでは使えません
308 :
デフォルトの名無しさん :02/10/02 22:28
>>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
>>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 〕
>>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 ああなるほど。
様々な環境で使えるようにするためにはそうするしかないわけか。
意味のある未定義なんかない。
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 */ じゃだめ?
ワラタ
348 :
デフォルトの名無しさん :02/10/03 16:30
main関数から returnで抜けるのと、 exitで抜けるのでは、 なにか違いがあるんでしょうか?
349 :
デフォルトの名無しさん :02/10/03 16:54
>>348 ちょっとある。
exit()は一応関数コールなので、スタックがぎりぎりだとあぼ〜んする
ことあり。と言ってもほとんどそんな事は皆無だが。
>>348 つい最近、同じような質問を見た記憶が。
353 :
10000000 :02/10/03 20:37
あいさつもなしに質問なんですがCでフォルダを指定して そのフォルダに入っているファイルの名前をすべて挙げるには どうすればいいでしょうか?
>>353 Cの標準関数にはフォルダにアクセスする関数はない。
OS依存ではいくつか方法はあるけど、私には君のOSはわからない
355 :
1000000 :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
359 :
デフォルトの名無しさん :02/10/03 20:53
すいません・・でも・・有名な。。本の紹介でいいんで。。 まとめを。スレの1に書いといてくれれば。もっと、いいです、、
360 :
デフォルトの名無しさん :02/10/03 20:55
>>359 お勧めの書籍スレがあるから、そこに書いてある本を
かたっぱしから読めばいいかも。
361 :
100000 :02/10/03 21:00
>>356 あいさつも無しに、うれしいです。
調べてみたところ私には全くの未知の関数でしたので
勉強してみます、パイプという言葉をCの中で知りませんでしたし。
それでわ。
>>357 そういう質問してる時点で、王道から激しく外れてるが。
ruby基地外に「Perlについての質問箱」が潰されたよ。 ひどいもんだ。見てきてみ。
ぷっ くやしいか?ああ?
369 :
デフォルトの名無しさん :02/10/03 21:53
お前の居場所はあのPerlスレしかなかったんだな。 可哀想な367 はやく自殺するなりなんなりしてくれ。
370 :
Default :02/10/03 21:57
C言語でキーボードの入力を、別の処理をしながら逐次受け付けるように するにはどうすればいいのですか?
>>370 またその質問かよ。
それに環境書けって言われてただろ。
進歩のない奴はだめだ。
372 :
デフォルトの名無しさん :02/10/03 22:08
>>370 別の処理をしながら時々キーボードの入力をチェックする
373 :
Default :02/10/03 22:09
OSはLinuxで、コンパイラはgccです。 すみませんでした。 スレ立てるまでも無い・・・スレにも一応書いたのですが。 よろしくおねがいします。
374 :
Default :02/10/03 22:11
>>372 キーボードの入力のチェックってどうやるんですか?
375 :
デフォルトの名無しさん :02/10/03 22:29
>>373 GUI使ってるのか、使ってないのかも書くように。
使ってるのなら、そのライブラリもな。
376 :
Default :02/10/03 23:03
たびたびすいません。 えーと、GUIを使ってて、Xlibを使ってます。 HPを調べてマウスの使い方は分かったのですが、キーボード はわかりませんでした。
>376 そっか、わからなかったか。 、、、で?
378 :
デフォルトの名無しさん :02/10/03 23:08
>377 確かに仕事で今はruby使ってるが。 唐突にそんなこと言われても ムカツクよりも「 なんだこいつ??」 みたいな感じだな。
あ、自分を批判してもーたw
381 :
デフォルトの名無しさん :02/10/03 23:20
>>376 Xlibならキーチェックする方法あるだろ。
それ使えばいいじゃん。
GCCのソースファイル見てるんだが、厨の俺にはどうしてもわからん記述がある。 iovfsscanf.cの中に extern u_long strtoul __P((const char*, char**, int)); extern long strtol __P((const char*, char**, int)); こんな宣言があるんだが、これってコンパイラ通るのか?
>>381 欲しかった情報にぴったりです。そのサイト。
そこにあるソースを参考にして、いろいろやってみたいと思います。
ありがとうございました。
386 :
デフォルトの名無しさん :02/10/03 23:36
放送禁止マクロです
#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*/
mainなんかなくてもいいじゃん!
>>395 そりゃそうだ。スタートアップスクリプトを書き換えて好きな関数から呼び出そう!
mallocでメモリ確保したいんですが、 mallocで確保できる容量の制限とか、 デカイ容量確保すると危険とかってあるんでしょうか?
そういうことは自分の処理系に訊いてくれ。 DOSなら、普通mallocで64KB以上のメモリは確保できないし それ以下でも失敗することがある。
>>397 失敗したらNULLが返るだけだからきちんと戻り値をチェックすれば問題ないと思うけど。
400 :
デフォルトの名無しさん :02/10/04 05:09
400get
すいません・・・マクロってどんな意味ですか?
おっきい
>>401 プリプロセッサのdefineディレクティブで定義されるもののことをマクロというようだ。
正式な言葉なのかただの慣習なのかはしらんが。
レスさんくすー
>>399 malloc() したときに, 確保できたものとして NULL を返さないような
環境もみたいだけど(自分では試してない), そういう環境では
もっと他の対策を取らないといけないのかも.
>>405 ヲイヲイ、そんな危険な仕様のmalloc()なんか使い物にならないぞ。
捨ててしまえ。
>>407 Linuxなんかそうだよ。
あまりに巨大なサイズを要求するとNULL返すけど、
小さい場合は触った瞬間にSEGVであぼーん。
よーするに、アドレス空間が使えることは保証するけど、
それに物理的な裏付けがあるという保証はない、と。
410 :
デフォルトの名無しさん :02/10/04 14:18
412 :
デフォルトの名無しさん :02/10/04 14:28
>>409 のリンクより。
> Linux 2.2以降では、/proc/sys/vm/overcommit_memory に1を書き込むと
> overcommit動作をするようになりますが、デフォルトではovercommitしません。
ほう。知らなかった。
まぁ、そんなにでかいメモリ使うアプリ書いたこともないけど。
誰も答えがわからなかったか? おまえら!! モニターをひっくり返せアホ! 11 = 99 - 88
ははは、バカだなぁ。413も414も。 11をひっくり返したら、LLになるだろ。 LL=99-88 になるから、全く合法。 (変数宣言はねーねどな。)
∧_∧∩ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´Д`)/< センセー、 ; がないので成立しません。 BASICでもやってろ! _ / / / \____________ \⊂ノ ̄ ̄ ̄ ̄\ ||\ \ ||\|| ̄ ̄ ̄ ̄ ̄|| || || ̄ ̄ ̄ ̄ ̄||
>>413 手を使わずにモニターひっくり返すのは結構難しいですね。
自分が上下逆に見ればいいだけでは?
どっちにしろコンパイルできないが。
>416 335によれば、 >88 - 66 = 11 >式が成立しません! である。「式」として成立するかはセミコロンによらない。 たとえば、if( LL = 99 - 88 )の括弧の中も「式」である。 ちなみにセミコロンが要るのは、式文。 >expression-statement: > expression(opt) ;
よしよし、あっちに積み木があるからあっちで遊ぼうね。
>>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
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なりを。
4行目はfgetじゃなくてfgets
聞けーーーー
じゃあ聞くけど、「未定義」「不定」 といったあいまいな部分 たとえば恒例の a=a++; などのやつな。 これらをきちんと動作定義しようという動きは無いのか? それと、定義しないならしないで なぜWarningなりErrorなりを コンパイルは吐かないんだ? 納得のいく説明しろ
a=a++; これは決まった処理するだろ
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++; 警告の出せる処理系を見てみたいもんだ。
>>437 未定義や不定の処理を修正すれば解決するだろ。
>>439 >> それと、定義しないならしないで なぜWarningなりErrorなりを
>> コンパイルは吐かないんだ?
> 厨房は、C なんか使うなってことだ。
答えになってないな。脳味噌入ってるか?
>>443 この話題いいかげん飽きた。
未定義でも自分で大丈夫だと思えば使えばいいじゃん。
誰も止めない。勝手にしろ。
> 未定義でも自分で大丈夫だと思えば 自分の使う環境で動作が確認されれば だろ。
ま た 未 定 義 か
C99に対応したコンパイラってありますか?
age
>>444 自分が大丈夫だと思っていれば、他人が大丈夫じゃないと思っていても
使っていいのか? ずいぶんと勝手な奴だな。協調性が無いんじゃないか?
>>446 全部出せとは言ってないよ。
動作未定義なコードを、それと解ってて放置する理由って なにかあるんだろうか…
文句があるなら使うな。もしくは自分で好みの言語を作れ。
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言語に限らず言語仕様に文句がないなんて、
良くわかってない初心者か、信者くらいなもんでしょう。
>>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 お前、文章読めるか? 答えになってないだろ。
答えが読み取れるというのなら言ってみろ。
どうせ、「お前には言ってもわからないよ」とか言い訳するのが関の山だろ。
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
>>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になるのがテキストモードでそ。
>>471 わかるようなわからんような・・
宣言してないものを使って変な感じがするのですが
>>473 int *p;はint型へのポインタの宣言。
p=&i;はpにiのアドレスを入れる。
printfの行の*pはpに入っているもの(iのアドレス)が指すものを参照する。
訂正 ×int *p;はint型へのポインタの宣言。 ○int *p;はint型へのポインタpの定義。
ポインタの定義と間接参照が同じ形だからいけないんだろうな・・・
>>474 >>475 このプログラムは使い方わかりました。ありがとう
参考書見てるとこれより全然複雑だ・・・・・
>>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 も馬鹿だけど煽りだけで的確な返答が出来ない奴も馬鹿だね。
501は自分の回答も馬鹿であることに気づいてるのか...
>>503 し〜〜〜っ、それいっちゃダメ。
>>501 は、今満足感でいっぱいなんだから。いらんこと言うとまた暴れだすかもしれないしね。
改行迷惑だって
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
ビデオメモリに直接描画してこそ漢
つーか、a=a++とかって、「Cの仕様」 じゃあ未定義だけど 「コンパイラの仕様」 だとバッチリ定義されてるんだよねー ってのが言いたかった。 なんてね。 いやマジでコンパイラで弾いてほしいよな。 マジでエラーやワーニングにしない理由が和姦ねーよ
死ぬほどデバイス依存
>>516 > マジでエラーやワーニングにしない理由が和姦ねーよ
>>498 > 要は、a = a++; なんて言うコードを見つける労力とそれに見合う利益を見比べて、多くの処理系では警告やエラーにしなくていいと思ってるだけだよ。
これでもダメか ?
>>517 デバイス ? コンパイラ依存だろ ?
>>515 ネットワークサーバなのでビデオメモリなぞ持っていない罠。
コンソールもシリアルコンソールだったりして。
>>516 ANSI の「未定義」ってのはそういう事です。つか RTFM だ莫迦。
>>518 517 は 516 に割り込まれました
どうでもいいんですが a = a++; こんな文を書く人が実際にいるんですか?
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 も、気に入らないなら自分で作ればいいんだよ。
>それにいっぱい奴やるいからな。 + 激しく意味不明 +
>>529 > それにいっぱい奴やるいるからな。
ちょっと変だな。
「それにやる奴いっぱいいるからな。」
に修正だ。
>>531 >ちょっと変だな。
ご謙遜を、、
すごく変ですよ。
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 頭大丈夫か ?
int a;
a++ = 1;
とやってんのと一緒だぞ。
>>537 > へ?どして?
ごめん、頭大丈夫じゃないのは俺だ。* と ++ の結合順序勘違いしてた。
>>534 >>535 が言うように、C だとダメで、C++ だと OK。
for(i=0;i<10;i++) (c<d)?*a++=1;:*b++=1; じゃだめなの?
>>539 いや、別にそれに相当するコードの書き方が
分からない訳じゃなくて、
一見正当そうに見えるコードにコンパイラが
ケチをつけた事にびっくりしただけの話
って、ゆうかー 何でループのなかで比較繰り返しているの??? 効率悪くなーい??
そういう意味ね。542先走ってて恥ずかしいや
> 効率悪くなーい?? 最適化かければ比較は外でやると思う
>>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++ では合法。
>>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でコンパイルしたら通ったよ。
わるい、-pedanticオプションもつけたらだめだっていわれた。
550 :
デフォルトの名無しさん :02/10/06 12:46
>>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を使えば画像を読み込んで表示することができるんではないでしょか。
>>552 もしかして今回の例でケチをつけられた所は
++ 演算子を使用している部分なの?
たとえば
*((c<d)?a:b)=1;
だったら問題が無かったのか?
>>556 > たとえば
> *((c<d)?a:b)=1;
> だったら問題が無かったのか?
そう言うこと。
>555 えっとGTKをどのように使えばよいでしょうか・・・? GTKはウィジェットをすこしつかったことがあるだけなんでよく分からないんです(汗;
↑528です^^
561 :
デフォルトの名無しさん :02/10/06 15:17
>>557 初心者をからかってたのしかったですか?
>>561 > 初心者をからかってたのしかったですか?
何を言いたいの ? 単なる煽りか ?
>>561 初心者は適当にあしらっておけばいーんだよ
564 :
デフォルトの名無しさん :02/10/06 15:41
>>561 話の内容が自分には理解できなくて悔しかったですか?
きみたち、たぶん、西友で買った霜降りジーパン履いてますね?
今パンツ一丁だが、何か?
俺は一応シャツも着てます
俺は一応ブラだけ着けてます。
>>569 > 俺は一応ブラだけ着けてます。
パンティーは ?
おれはちんぽに女をつけてます。
漏れはケツの穴に男がささってます
573 :
デフォルトの名無しさん :02/10/06 20:47
すみません、あるバイトの中の、特定のビットをOFFにする方法を知りたいのですが どなたかご存知ないですか?
ビット演算かましてください
x &= ~(1<<bit);
>>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]; などはだめなんでしょうか?
>>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 になることを期待してるならダメ。
>>581 nt num=atoi(ss[0)]
もあかんですよね?;
そんなもんまずコンパイルが通らん
>>584 > nt num=atoi(ss[0)]
一行中に、三つ以上間違いがある投稿は、ネタとみなす。
>>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 から読め。
これでいいですか? 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); }
>>598 あと追加質問で、DllMain()の
buffer=malloc(16);
を res_c()で行うのはOKですか?
>>598 うむむ。windowsに詳しくないのだが、それ、リエントラントじゃないのでは。
共有ライブラリでリエントラントでないのはまずいんじゃないの。
ポインタbufferは、プロセス別に取られるはずだから、別にいいんでわ? Threadとか、ライブラリにグローバル変数使う事については知らない。
>>601 あ、そうなんですか。失礼しました。
ただ、マルチスレッドでは問題が起きそうだね。
res_cを呼んだスレッドがあって、返ってきた物を使う前に
別のスレッドがres_cを呼んじゃって書き換えられるという
ことは十分ありうる。
char c[80]; sizeof(c) って可能なんですか? どういう動作をしているんでしょうか?
sizeof(char) * 80 になるYO!
>>602 仮に文字列の書き換えがres_c内だけでしか行われて
いないなら、別スレッドで書き換えられても問題なし。
しかし、それ以前に
>>598 のやっていることは
あまり意味がないというか、一体何がやりたいんだ?
> buffer=malloc(16);
> を res_c()で行うのはOKですか?
これをやるならわかるけど。
607 :
デフォルトの名無しさん :02/10/07 01:47
テキストファイルの一行目だけを読み込んでSというAnsiString変数に代入したいのだが・・・
>>604 sizeof(char)*80
と毎回やっていた俺はあほですか?
自動で文字列数(配列数)を調べてくれるって事?
char型=1だからできる技なんですよね?
で、何?
>SというAnsiString変数 AnsiStringって型みたいだが、本当にCか?
>>608 >char型=1だからできる技なんですよね?
んなこたーない
C++でした。Stringに代入したいんです。
>>608 int a[80]; なら sizeof(a) は sizeof(int)*80 になるよ。
> と毎回やっていた俺はあほですか?
80を #define しているなら別にいいんでないかな
たとえば
char c[80]; を
char* c = malloc(80);
に書き換えたときのために。
>>607 C++Builderですか?
AnsiStringに>>を適用すると、改行文字も含めてファイルの中身を
全部読んでしまいますからねえ。
私はchar[]に一度読み込んで、S(buf)などのコンストラクタを呼び出して
いますがスマートじゃないですね・・・・・
>>607 std::stringなら、getline(strm, str); という形式が使える。
ごめん。607しか見てなかった。
>>616 は間違いです
>>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にコピーしてはどうか。
622 :
Default :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 その例における、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;
}
}
>622 XLookupString 後に key に入っている KeySym を使いましょう。
>>635 ま、3回もmemcpy呼ぶのとどっちが遅いかはなんとも言えんが(w
というか、
>>36 でも言ったけどqsortは失敗が許されないからmallocは使えない。
なんでqsortの要素の交換方法なんてマイナーな話題が二度も同じスレででるんだろう。
int num[NUM_SIZE]; &numとnumが同じなの? numは,配列の先頭アドレスですよね &numは・・・? &は,アドレスを指すから・・・?
ageてないからネタ確定ってことでよろしいか?
ネタじゃないんなら
>>1 のリンク読め
int num[NUM_SIZE]; &numとnumが同じなの? numは,配列の先頭アドレスですよね &numは・・・? &は,アドレスを指すから・・・?
ネタ=sageはいかがなものか
>>641 まず
>&numとnumが同じなの?
なんでこんなふうに思っちゃったのかが問題だ
644 :
D級初心さ :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);
とかできるかもしれましぇん
俺もそう書いてる 特にクレームつけられたことはないね
>>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
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);
とか
>>674 int a[10];
f(a);
って?ポインタ入ってないんですが
676 :
デフォルトの名無しさん :02/10/08 14:45
画像処理ボードから取り込んだデータ(画素値,char型)をintに変換したい のですが,atoiを使ってるのですが,うまくいきません. なんか他に方法ありますか? 取り込むデータは char data; で定義しています.
ボードから正しく取り込めていることは確認しています. あと.atoiを使うと,"char"を "const char*"に出来ないとか出ます.
>>676 ,677
char data;
int idata;
idata = data;
>>675 > って?ポインタ入ってないんですが
関数の引数がポインタなんだと思うが。
>>674 int a[10];
f(a);
ポインタ演算子入ってないんですがf(a)のaはポインタ
というのですか。
>>680 ありがd。書き込みのタイミング悪かったっす。
>>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
>>685 ハズレ
> int &a
> int &b
int *a
int *b
ま た 未 定 義 か
>678 1バイト文字です.データが8ビットなんで. >679 試してみたらうまくいってるみたいです.ありがとうございます.
(既にあるデータ(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を学ぶ気ある?
あるんなら、ヒントだけにしとくし、全くないのなら、答え書いちゃうけど。
>>698 あ、そうか、ここ宿題スレじゃなかった。すんませんですた。
701 :
デフォルトの名無しさん :02/10/08 21:06
ヒントでお願いします!
ヒント ・もっと自分の頭で考えましょう
>>700 他のスレにも書き込んでおいて知らなかったはないだろ。
(1)#include <stdio.h> main() { printf("┏┓\n"); printf("┗┛"); } はこれで表示されることがわかったのですが、(2)がわかりません。 ヒントだけでいいのでお願いします!
708 :
デフォルトの名無しさん :02/10/08 21:16
もうグダグダだな。
すみません。宿題の方で聞けといわれていたもんで・・・ 悪気はなかったんです。
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");
}
つうか、わざわざ関数作ってやることなのか?
つーかお前ら優しすぎるぞ。
枠がるな
皆様、どうもありがとうございました! 感動しました。 これを応用していろいろ頑張ってみます。
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 if (スペースキーが押されたか) {
押された。
}
OSによって違う
730 :
デフォルトの名無しさん :02/10/08 21:44
731 :
デフォルトの名無しさん :02/10/08 21:45
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];
734 ありがとうございました
736 :
デフォルトの名無しさん :02/10/08 22:03
int ii: int nn=0; for(ii=0; ii<i; ii++ ){ nn = n[ii]; }
ごめん n[],n一緒に使えないじゃん。直しといて。逝って来ます。
>>736 >>734 から2分遅れの上に間違ってる
> nn = n[ii];
nn += n[ii];
<突然ですがここで問題です。> 和宛ゲームの作成! 仕様:ある任意の数(固定)をプレイヤーは当てます。任意の数字は1〜100 答えられる回数は10回。プレイヤーは答えるたびにあとチャンスはn回 です。との情報を受ける。 外れた場合は入力した数字が任意の数字より大きいか小さいか知らせる。 10回のチャンスがなくなるまでつづく。 以上
> <突然ですがここで問題です。> こんな切り出し方するヤシは放置。何様だ?
「和宛ゲーム」の読みを当てるのが問題ですか?
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;}
2^10=1024だから解ける。
とりあえず一行縮めてみた。 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("ザンネンデシタ");}
754 :
デフォルトの名無しさん :02/10/08 23:06
>>751 ワラタ。
つーか、イカスじゃねえか。そのサイト。
YOっしゃ。削除依頼だしてこい。
>>751 下手な解説サイトより、笑えてイイ。
つづきはあるのか?
数と言えば自然数しか思い浮かばない ヴァカどもばかりだな、ここは・・・
自然数に0が含まれるかどうかの議論しようぜ
なるほど、3.14157とかされると解けんなw 小数点以下第1位までなら解けるってとこか
>>757 よし、じゃぁ、含まれる。
なぜなら、テストで0点取ったことがあるから。
まさにしzうぇんたい。
議論するものなのか?自然数・・・
>>756 出題の意図を常識の範囲で読み取る能力もないクズ
よりはマシだろうけどな。
>>760 0が含まれると主張している人たちもいた
電波系というわけでなく・・・
>>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使うのやめたんだ?(^_^;)
>771 短くしたいから。
773 :
デフォルトの名無しさん :02/10/09 12:04
プログラムを実行し始めてからの時間を返すclockという関数がありますよね? あれは時間がclock_t型で表せる最大の数を超えたら間違った値が返ってくるんですか?
>>773 表現できる限界を超えても正しい値が返ってくるすげぇ実装方法があったら教えてプリーズ
>>774 GENKAI TOPPA
KYOなら出来る
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';} もっと良い方法があったら教えて。
正直、ネタにしか見えないんでマジレスする気にならん・・ 親切なやつ教えてやれよ↓
787 :
デフォルトの名無しさん :02/10/09 16:34
>>784 memset(s, ch, strlen(s));
は?
memset()でいいと思うけど、
>>787 のstrlen()はマズイだろう。
memset(str, char, num); str[num] = '\0';
sprintf
memsetってint型の配列のすべての要素を1とかで初期化したい時に使えないから嫌い。 そんなことが必要な時はあまりないけど。
> そんなことが必要な時はあまりないけど。 そう?そういうケースは結構あると思うけどな。 どうでもいいが無意味な空行はやめてくれ。 ウケると思ってるのかしらんが、読みにくくてウザイだけだ。
>>792 ごめんなさいね。
でも最後の行は無駄ですね。「どうでもいいが無意味な空行はやめてくれ。」だけで十分だと思います。
>>793 まあいいだろう。
でも最後の行は無駄ですね。謝るなら謝るだけにしろ。この糞が。
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
>>799 1についてですが、環境依存ですができます。「エスケープシーケンス」でgoogle
2についてですが、引数が""で囲まれている場合は文字列とみなされアドレスが渡されます。
>>806 キーを押すとすぐに反応する。
エコーなしに一文字読む。
エコーありはgetche。
だったかな。
>>807 お願いです。
次はkbhit関数の内容を教えて下さい。
810 :
デフォルトの名無しさん :02/10/09 21:50
次は僕の質問に答えてください。 WSAStartup関数の内容、使い方、サンプルソース。
int 21hについて教えてください・・・
次はlistenの内容、使い方を丁寧に教えてもらおうか。
forkのつかいかたが分かりません
>>813 手で握ってさしたりすくったりするだけだろ
810や813は答えてもらっているのに、おいらは放置! ウワァァン
>>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
キターーーーーーーーーーーーーーーー!!!!!
>>820 その調子でconio.hに定義されている関数を全て教えてください。
>>820 すっげーいい。とくにアクションの例が。
実験してみるよ。
825 :
デフォルトの名無しさん :02/10/09 23:42
C言語を使ってプログラミングしたいんですけど フリーソフトでおすすめのものってありますか?
すいませんマルチになります。 web板の方が寂しいのでこちらでCGIに関するC言語のサーバー設定を聞いても いいでしょうか?こちらの方が詳しそうな人が多そうなので… だめなら消えます。
C言語のサーバーってなんやー?
831 :
デフォルトの名無しさん :02/10/10 11:22
>>829 激しくスレ違いな気がするが、質問ならageて。
コンパイラが進化した・・・ warning C4553: '==' : 演算子にプログラム上の作用がありません。'=' を意図しましたか?
聞いていいのかな? 思いっきりスレ違いは覚悟しておりますが、多分詳しい人多そうなので 教えて下さい。 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); }
気がするのですか、そうですか、良かったですね。
840 :
nanashi :02/10/10 14:06
99999以下とは限らない正の整数を次々と読み、データの個数と最小値、 2番めに小さい値および3番目に小さい値を印字するプログラムを作れ。ただし、 データがつきたことをあらわすために、0または負の数を入力することにする。 このアルゴリズムのを書いてください。流れ図でも箇条書きでもよいです。
841 :
------------------さん :02/10/10 14:09
あ、てか自分でわかったかも ポインタつかわないと void z(int c)のcと下のcは別物あつかいみたいになってしまう??
宿題は宿題スレへ逝け。 ただし丸投げする前にすこしは自分で考えろ。
843 :
nanashi :02/10/10 14:13
逝ってきます
844 :
------------------さん :02/10/10 14:14
てか受け渡しっぱなしでcに帰ってこないか。 あー自分でわかりました。
845 :
デフォルトの名無しさん :02/10/10 14:37
最小値の表し方は?
846 :
デフォルトの名無しさん :02/10/10 14:38
848 :
デフォルトの名無しさん :02/10/10 14:52
コボラーってなんですか?
>>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 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を表示するということで、いいんですか。
860 :
デフォルトの名無しさん :02/10/10 17:04
#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("モナー ");} なら問題なく理解できたと言うことなのかなぁ。
>860 定義順と呼び出し順に相関関係はないよ そのようですね。さっき試したら問題なく表示されました。 まだプログラムの流れをすんなり掴めていないみたいなので、 もっとたくさん練習してそういうことが分るようにがんばります。
>>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 ; } ;
868 :
デフォルトの名無しさん :02/10/10 17:40
*.iniファイルへの値の書きこみ、値の取得はどのようにすればいいんですか?
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 な罠
kekooooon
知ってたけどね
ハイハイ
返事は1回
ハーーーーーーーーーーーーーイ
(・∀・)
888 :
デフォルトの名無しさん :02/10/10 20:13
std:: ってなに
>>888 > std::
さぁ?Cにはそんなものないよ
>>851 つか、リングバッファ使えばいいのでは?
ごめんなさい、よくありませんでした。反省します。
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 まずプログラムの基本ができてない気がする。
数学では 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 > n=++n;
?? また、未定...。
906 :
デフォルトの名無しさん :02/10/10 21:53
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);
どうよ?
人に感謝されるというのは気持ちのよいことだ・・・
なんで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
>>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で初期化しといたら?
おれは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 文字列リテラルは別のところに集められるのが普通。
コンパイル後のバイナリをバイナリエディタなどで見るとわかると思う。
(アセンブラわかるのならアセンブラコード見てもいいと思うけど)
プログラム実行時には実行ファイルから文字列リテラルをメモリ内に読み
込んでその先頭アドレスを使用する。
文字列リテラルをメモリ内に読み込むのはOSな。
947 :
デフォルトの名無しさん :02/10/11 08:34
>>942 function(文字列のポインタ、文字列のポインタ)
↓
function(str,"なんなのこれ")
みたいな説明になってるんだけど、変数strの識別子が先頭アドレスを表すことは分かるけど、
”文字列”を直接関数に引数で渡すと、ポインタを渡したってことになるわけ?
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ポインタに
置き換えられていると思えば良いのではないかな
955 :
デフォルトの名無しさん :02/10/11 09:53
リテラル。セグメント。 初耳・・・どんな意味で?
僕に聞かれてもあんまりシランっす。 引っ張り出した本に書いてありますた。 -------------------- スタックセグメント // ローカル変数とか ↓ ↑ ここから-------------- ヒープ // mallocにより動的確保 BBS // グローバル変数(初期値なし0) データ // グローバル変数(初期値あり) -----------------ここまで、データセグメント テキストセグメント // プログラムのコード部分が // おさめられている読み出し専用領域 てなふーに割り当てられるっちゅ−よーなことらしいです。 シランでもいいと思いますた。
>>956 それは個別の実装の話だから一般論として語るもんじゃないよ。
おsage。 わすれてた。
>>956 シランでもいいかどうかは時と場合によるが。
ついでに言うと、BSSだと思うが。BBSじゃなくて。
> 957 うぅ、 言われてみればLinux固有だと気がつきました。 あほなこと語ってしまいましたすみません。
>どこでもさせるようです arr_ptはarrayの先頭のアドレスを受け取っただけ。 arrayを宣言したときにその後ろに連続してデータが入るので、 arr_pt[i]で辿る事が出来る。
プログラムはarr_pt[i]=*(arr_pt+i)と解釈している。
i[arr_pt]
> 963
そうですよね。
ぽいんたーっていうと、ふつーそれしか思い当たらないので
>>941 さんが銭湯アドレスって言葉にこだわって混乱してるのかと思って
ぽいんたーは銭湯アドレスを取得したら、
メモリー領域にアクセスするのに使えると思えばわかりやすいかと思ったら
なおさらわかりずらかったです。
それよりも、>951で不可解なのは、
変数 j の使い道だと思います。
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でできますけど。
次スレたててきます。
>>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);
いただいちゃってください
}
void func(Object* nanika) {
// 988さん、Object型の扱い方教えてくらはい
return 0;
} // nanika は一度も使用されませんでした。
994
まんこ
ちんこ
すっせんんー
せせせせせんんんー
999
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。